2016-03-09 47 views
0

这是我使用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()返回数据库对象同样是行不通的。感谢帮助。

回答

3

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

+0

谢谢。这是一个不小心的错误:P – shivams