我正在尝试将我的数据库代码分组到一个子包中,这将封装我的数据库连接和所有准备好的语句。
我可以在包的init
函数中创建数据库连接和语句,但我需要在某些时候关闭它们。
在一个程序中,这些变量在使用它们的代码中初始化,我会使用defer db.Close()
等,但是如何在这里解决这个问题?
我不希望公开包的全局变量(连接和语句),以便调用者可以访问它们来关闭它们。有没有办法以更优雅的方式做到这一点?
我怀疑我可能有一个错误的范例,我试图用一种没有它们的语言来创建对象(这基本上就是它在这里)。如果是这样,那么我将非常感谢有关如何做到这一点的任何帮助。
package database
import (
"database/sql"
_ "github.com/lib/pq"
)
var db *sql.DB
var stmtSelectUser *sql.Stmt
func GetUser(email string) string {
var name string
stmtSelectUser.QueryRow(email).Scan(&name)
return name
}
func init() {
var e error;
db, e = sql.Open("postgres", "host=localhost dbname=pictocat sslmode=disable")
stmtSelectUser, e = db.Prepare("select * from users where email='$1'")
}
答案 0 :(得分:0)
从您的示例代码中可以清楚地知道您的问题是什么,但一般来说:
运行语句的函数需要完成语句而Close()它或者你需要在你的包中添加一个函数,以便调用者可以关闭它;就这么简单。
您不需要公开包中的所有数据库内容,只需要一个反过来调用Close()的函数。