Rumah >pembangunan bahagian belakang >Golang >Tidak dapat menyambung ke pangkalan data psql

Tidak dapat menyambung ke pangkalan data psql

王林
王林ke hadapan
2024-02-09 18:00:101269semak imbas

无法连接到 psql 数据库

Editor PHP Apple kadangkala menghadapi masalah "tidak dapat menyambung ke pangkalan data psql" semasa menjalankan operasi pangkalan data. Mesej ralat ini biasanya muncul apabila menggunakan pangkalan data PostgreSQL dan mungkin disebabkan oleh kegagalan sambungan disebabkan beberapa sebab biasa. Terdapat banyak cara untuk menyelesaikan masalah ini, termasuk menyemak parameter sambungan pangkalan data, mengesahkan sama ada pangkalan data sedang berjalan, menyemak sambungan rangkaian, dsb. Dalam artikel ini, kami akan memperkenalkan beberapa penyelesaian biasa untuk membantu pembaca menyelesaikan masalah ini dengan cepat dan melaksanakan operasi pangkalan data dengan lancar.

Kandungan soalan

Saya cuba menyambung ke pangkalan data tetapi saya mendapat ralat apabila saya membuat permintaan curl ke titik akhir menggunakan kaedah get. Saya menyemak semula kelayakan pengguna dan memberikan hak pengguna penuh dan super. Berikut ialah ralat yang saya dapat semasa melencongkan titik akhir:

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>.

Sambungan diwujudkan dengan pangkalan data, dan apabila permintaan dibuat kepada pangkalan data, ralat ini dicetuskan:

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?)

Program utama:

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
    }

}

Saya cuba menyemak semula kebenaran pengguna dan format pangkalan data serta pesanan. Semuanya mengikut kod. Sambungan diwujudkan tetapi gagal dengan panik apabila menanyakan pangkalan data.

Penyelesaian

Anda tidak memulakan tahap pakej db pembolehubah dengan betul.

Pengendali

:=, dipanggil "pembolehubah pendek pengisytiharan", mengisytiharkan dan memulakan pembolehubah baharu dalam skop bloknya. Mana-mana pembolehubah dengan nama yang sama dalam skop luar akan "tersembunyi".

Untuk memulakan pembolehubah peringkat pakej dengan betul, anda boleh menggunakan tugasan mudah:

65 bedfd11e6f5

Atau anda boleh menggunakan := tetapi kemudian gunakan nama pembolehubah yang berbeza dan pastikan anda menggunakannya untuk tugasan:

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"
}

Atas ialah kandungan terperinci Tidak dapat menyambung ke pangkalan data psql. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam