无法返回数据库对象。

这是我使用 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()inside返回的 db 对象执行相同操作main()不起作用。感谢帮助。


森栏
浏览 206回答 1
1回答

江户川乱折腾

您的数据库在您返回的那一刻就关闭了,Create因为您的 defer 在它里面而不是 inside main。将 defer 移到 main,它应该可以按预期工作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go