Heim >Backend-Entwicklung >Golang >Es kann keine Verbindung zur psql-Datenbank hergestellt werden

Es kann keine Verbindung zur psql-Datenbank hergestellt werden

王林
王林nach vorne
2024-02-09 18:00:101264Durchsuche

无法连接到 psql 数据库

PHP-Editor Apple stößt beim Ausführen von Datenbankoperationen manchmal auf das Problem „Verbindung zur psql-Datenbank kann nicht hergestellt werden“. Diese Fehlermeldung erscheint normalerweise bei der Verwendung einer PostgreSQL-Datenbank und kann aus häufigen Gründen auf einen Verbindungsfehler zurückzuführen sein. Es gibt viele Möglichkeiten, dieses Problem zu lösen, einschließlich der Überprüfung der Datenbankverbindungsparameter, der Bestätigung, ob die Datenbank ausgeführt wird, der Überprüfung der Netzwerkverbindung usw. In diesem Artikel stellen wir einige gängige Lösungen vor, die den Lesern helfen sollen, dieses Problem schnell zu lösen und Datenbankvorgänge reibungslos durchzuführen.

Frageninhalt

Ich versuche, eine Verbindung zur Datenbank herzustellen, erhalte jedoch eine Fehlermeldung, wenn ich mit der Methode get eine Curl-Anfrage an den Endpunkt stelle. Ich habe die Benutzeranmeldeinformationen noch einmal überprüft und Voll- und Superuser-Rechte gewährt. Hier ist die Fehlermeldung, die ich beim Curling des Endpunkts erhalte:

santosh@pkg*$:curl -i localhost:8080/books/show
http/1.1 303 see other
content-type: text/html; charset=utf-8
location: /books
date: sat, 19 nov 2022 12:09:52 gmt
content-length: 33

<a href="/books">see other</a>.

Es wird eine Verbindung mit der Datenbank hergestellt und wenn eine Anfrage an die Datenbank gestellt wird, werden diese Fehler ausgelöst:

santosh@pkg*$:go run main.go 
database connection successful.
2022/11/19 17:39:47 http: panic serving 127.0.0.1:44324: runtime error: invalid memory address or nil pointer dereference
goroutine 35 [running]:
net/http.(*conn).serve.func1()
        /usr/local/go/src/net/http/server.go:1850 +0xbf
panic({0x6960e0, 0x8e5630})
        /usr/local/go/src/runtime/panic.go:890 +0x262
database/sql.(*db).conn(0x0, {0x7593d0, 0xc00011a000}, 0x1)
        /usr/local/go/src/database/sql/sql.go:1288 +0x53
database/sql.(*db).query(0x6?, {0x7593d0, 0xc00011a000}, {0x6da967, 0x13}, {0x0, 0x0, 0x0}, 0x68?)

Hauptprogramm:

var db *sql.DB

type Books struct {
    Isbn   string
    Title  string
    Author string
    Price  float32
}

func init() {
    var err error
    args := fmt.Sprintf("host=%s port=%d dbname=%s user='%s' password=%s sslmode=%s", "localhost", 5432, "bookstore", "santosh", "dts123", "disable")
    db, err := sql.Open("postgres", args)
    if err != nil {
        fmt.Printf("Creating Database %s", err)
    }
    if err = db.Ping(); err != nil {
        panic(err)
    }
    fmt.Println("Database connection succussful.")

}

func main() {
    http.HandleFunc("/", index)
    http.HandleFunc("/books", booksIndex)
    http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, r *http.Request) {
    http.Redirect(w, r, "/books", http.StatusSeeOther)
}

func booksIndex(w http.ResponseWriter, r *http.Request) {
    if r.Method != "GET" {
        http.Error(w, http.StatusText(405), http.StatusMethodNotAllowed)
        return
    }

    rows, err := db.Query("SELECT * FROM books")
    if err != nil {
        http.Error(w, http.StatusText(500), 500)
        return
    }
    defer rows.Close()

    bks := make([]Books, 0)
    for rows.Next() {
        bk := Books{}
        err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
        if err != nil {
            http.Error(w, http.StatusText(500), 500)
            return
        }
        bks = append(bks, bk)
    }
    if err = rows.Err(); err != nil {
        http.Error(w, http.StatusText(500), 500)
        return
    }

}

Ich habe versucht, die Benutzerberechtigungen sowie das Datenbankformat und die Reihenfolge noch einmal zu überprüfen. Alles entspricht dem Code. Die Verbindung wird hergestellt, schlägt jedoch bei der Abfrage der Datenbank mit einer Panik fehl.

Problemumgehung

Sie haben die Paketebenenvariable db nicht richtig initialisiert.

Der

:=-Operator, auch „kurze Variable deklaration“ genannt, deklariert und initialisiert eine neue Variable in ihrem Blockbereich. Jede Variable mit demselben Namen im äußeren Bereich wird „versteckt“.

Um Variablen auf Paketebene ordnungsgemäß zu initialisieren, können Sie eine einfache Zuweisung verwenden:

65 Bettenfd11e6f5

Oder Sie können := verwenden, dann aber einen anderen Variablennamen verwenden und darauf achten, diesen für die Zuweisung zu verwenden:

var db *sql.DB

func init() {
    args := fmt.Sprintf("host=%s port=%d dbname=%s user='%s' password=%s sslmode=%s", "localhost", 5432, "bookstore", "santosh", "dts123", "disable")

    _db, err := sql.Open("postgres", args)
    if err != nil {
        fmt.Printf("Creating Database %s", err)
    }
    // ...

    db = _db // set "global"
}

Das obige ist der detaillierte Inhalt vonEs kann keine Verbindung zur psql-Datenbank hergestellt werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen