为了账号安全,请及时绑定邮箱和手机立即绑定

无法连接到 psql 数据库

无法连接到 psql 数据库

Go
慕村9548890 2023-03-15 15:33:46
我正在尝试连接到数据库,但是当我使用该方法向端点发出 curl 请求时出现错误GET。我仔细检查了用户凭据并授予了完全权限和超级用户权限。以下是卷曲端点时出现的错误:santosh@pkg*$:curl -i localhost:8080/books/showHTTP/1.1 303 See OtherContent-Type: text/html; charset=utf-8Location: /booksDate: Sat, 19 Nov 2022 12:09:52 GMTContent-Length: 33<a href="/books">See Other</a>.与数据库建立连接,当向数据库发出请求时会触发这些错误: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 dereferencegoroutine 35 [running]:net/http.(*conn).serve.func1()        /usr/local/go/src/net/http/server.go:1850 +0xbfpanic({0x6960e0, 0x8e5630})        /usr/local/go/src/runtime/panic.go:890 +0x262database/sql.(*DB).conn(0x0, {0x7593d0, 0xc00011a000}, 0x1)        /usr/local/go/src/database/sql/sql.go:1288 +0x53database/sql.(*DB).query(0x6?, {0x7593d0, 0xc00011a000}, {0x6da967, 0x13}, {0x0, 0x0, 0x0}, 0x68?)主要程序:var db *sql.DBtype 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)}我尝试仔细检查用户权限和数据库格式以及顺序。一切都符合代码。连接已建立,但在查询数据库时因紧急情况而失败。
查看完整描述

1 回答

?
绝地无双

TA贡献1946条经验 获得超4个赞

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

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

要正确初始化包级变量,您可以使用普通赋值:

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


    var err error

    db, err = sql.Open("postgres", args)

    if err != nil {

        fmt.Printf("Creating Database %s", err)

    }

    // ...

}

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


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"

}


查看完整回答
反对 回复 2023-03-15
  • 1 回答
  • 0 关注
  • 108 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信