卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34974本站已运行393

无法连接到 psql 数据库

无法连接到 psql 数据库

php小编苹果在进行数据库操作时,有时会遇到"无法连接到 psql 数据库"的问题。这个错误信息通常出现在使用PostgreSQL数据库时,可能是由于一些常见的原因导致的连接失败。解决这个问题的方法有很多,包括检查数据库连接参数、确认数据库是否在运行、检查网络连接等。在本文中,我们将介绍一些常见的解决方法,帮助读者快速解决这个问题,顺利进行数据库操作。

问题内容

我正在尝试连接到数据库,但当我使用 get 方法向端点发出curl 请求时出现错误。我仔细检查了用户凭据,并授予了完全权限和超级用户权限。 以下是卷曲端点时出现的错误:

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

see other.

与数据库建立连接,当向数据库发出请求时,会触发这些错误:

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

主程序:

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
    }

}

我尝试仔细检查用户权限和数据库格式以及顺序。一切都符合代码。连接已建立,但在查询数据库时因恐慌而失败。

解决方法

您没有正确初始化包级 db 变量。

:= 运算符称为“短变量声明”,在其块作用域中声明并初始化一个变量。外部作用域中任何具有相同名称的变量都将被“隐藏”。

要正确初始化包级变量,您可以使用简单的赋值:

65床fd11e6f5

或者您可以使用 := 但随后使用不同的变量名称并确保将其用于分配:

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"
}
卓越飞翔博客
上一篇: 如何管理测试依赖项的初始化代码
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏