我正在尝试将我的数据库代码分组到一个子包中,这将在某种程度上封装我的数据库连接和所有准备好的语句。
我可以在包的 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'")
}
最佳答案
从您的示例代码中并不清楚您的问题是什么,但总的来说:
要么运行语句的函数需要完成语句并对其进行 Close(),要么您需要向包中添加一个函数以便调用者可以关闭它;就这么简单。
您不需要公开包中的所有数据库内容,只需公开一个依次调用 Close() 的函数即可。
关于go - 包含需要清理的对象的包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24592898/