postgresql - 无法返回数据库对象。

标签 postgresql go

这是我使用 postgres 数据库的代码。

package main

import (
    "database/sql"
    _ "github.com/lib/pq"
    "fmt"
    "log"
)

//Details required for connection
const (
    HOST     = "HOSTNAME"
    USER     = "USER"
    PASSWORD = "PASSWORD"
    DATABASE = "DB"
)

func Create() (*sql.DB) {

    dbinfo := fmt.Sprintf("host=%s user=%s password=%s dbname=%s", HOST, USER, PASSWORD, DATABASE)
    db,err  := sql.Open("postgres", dbinfo)
    defer db.Close()

    if (err != nil) {
        log.Fatal(err)
    }

    err = db.Ping()

    if err != nil {
      log.Fatal(err)
    }

    return db
}


func main() {
    db := Create()
    querStmt, err := db.Prepare("select count(*) from table")

    if err != nil {
        fmt.Printf("Cannot prepare query\n")
        log.Fatal(err)
    }
    res, err := querStmt.Exec()
    if err != nil {
        fmt.Printf("Cannot execute query\n")
        log.Fatal(err)
    }

    fmt.Printf("%v\n", res)
}

运行这段代码时出现这个错误

Cannot prepare query
2016/03/09 16:57:23 sql: database is closed

如果我从 Create() 运行查询,那么它会完美地工作,但在 main()Create() 返回的数据库对象上做同样的事情> 不工作。感谢帮助。

最佳答案

当您从 Create 返回时,您的数据库已关闭,因为您的 defer 在其中而不是在 main 中。将延迟移动到 main,它应该按预期工作。

关于postgresql - 无法返回数据库对象。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897251/

相关文章:

database - Postgres 长时间运行的事务在父分区表上持有锁

go - 删除 slice 中未分配的(零值)

go - go install 导入后无法识别包

algorithm - Go 程序不显示分配给变量的 Sliced Int 的期望结果

google-app-engine - 如何在 Google App Engine 中使用 Gin-gonic 中间件?

go - 在 Go 中读取一行数字

sql - INSERT 多行与 RETURNING 子句中的 ID 组合

database-design - 设计关系数据库 - 使用分层数据模型还是避免使用它们?

linux - 将要转储的表作为 bash 脚本中的选项转储 postgresql 数据库

postgresql - pgAdmin 4 中的高延迟时间打开包含许多表的数据库