Maison > développement back-end > Golang > le corps du texte

Impossible de se connecter à la base de données psql

王林
Libérer: 2024-02-09 18:00:10
avant
1221 Les gens l'ont consulté

无法连接到 psql 数据库

Éditeur PHP Apple rencontre parfois le problème de « impossibilité de se connecter à la base de données psql » lors de l'exécution d'opérations de base de données. Ce message d'erreur apparaît généralement lors de l'utilisation d'une base de données PostgreSQL et peut être dû à un échec de connexion pour des raisons courantes. Il existe de nombreuses façons de résoudre ce problème, notamment vérifier les paramètres de connexion à la base de données, confirmer si la base de données est en cours d'exécution, vérifier la connexion réseau, etc. Dans cet article, nous présenterons quelques solutions courantes pour aider les lecteurs à résoudre rapidement ce problème et à effectuer les opérations de base de données en douceur.

Contenu de la question

J'essaie de me connecter à la base de données mais j'obtiens une erreur lorsque je fais une requête curl au point final à l'aide de la méthode get. J'ai vérifié les informations d'identification de l'utilisateur et accordé les droits complets et super-utilisateur. Voici l'erreur que j'obtiens lors du curling du point final :

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>.
Copier après la connexion

Une connexion est établie avec la base de données, et lorsqu'une requête est faite à la base de données, ces erreurs se déclenchent :

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?)
Copier après la connexion

Programme principal :

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
    }

}
Copier après la connexion

J'ai essayé de vérifier les autorisations des utilisateurs, le format et l'ordre de la base de données. Tout est conforme au code. La connexion est établie mais échoue avec panique lors de l'interrogation de la base de données.

Solution

Vous n'avez pas initialisé correctement la variable niveau package db.

L'opérateur

:=, appelé "variable courte declaration", déclare et initialise une variable new dans sa portée de bloc. Toute variable portant le même nom dans la portée externe sera "cachée".

Pour initialiser correctement les variables au niveau du package, vous pouvez utiliser une simple affectation :

65 litsfd11e6f5

Ou vous pouvez utiliser := mais utilisez ensuite un nom de variable différent et assurez-vous de l'utiliser pour la mission :

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"
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!