这是我使用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对象上执行相同操作是行不通的。感谢帮助。
答案 0 :(得分:3)
当您从Create
返回时,您的数据库已关闭,因为您的推迟位于其中,而不在main
内。将延迟移动到main,它应该按预期工作。