无法返回数据库对象。

时间:2016-03-09 16:30:59

标签: 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()运行查询,那么它可以正常工作,但在Create()main()返回的db对象上执行相同操作是行不通的。感谢帮助。

1 个答案:

答案 0 :(得分:3)

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