我想要完成的是在多个函数之间共享一个db.sqlx的指针,除了帖子说沿指针传递,这很好但是如何在接口中这样做?我找不到任何可以说明在任何地方使用它的东西。基本上我所拥有的是Datastore类型的接口。我也有mysql&实现数据存储区类型的pgsql。接口本身工作正常,但问题是我试图为* sqlx.DB创建单个连接函数,以便在实现的接口中的所有函数之间共享。我认为问题是我在如何分享界面功能之间的指针或甚至"其中"分享它。主界面如下所示:
var (
storage Datastore
db * sqlx.DB
)
type Datastore interface {
Insert(db *sqlx.DB, table string, item DataItem) bool
CheckEmpty(db *sqlx.DB, table string) bool
FetchAll(db *sqlx.DB, table string) []DataItem
DBInit(db *sqlx.DB)
initDB()
}
在我实现的接口(简化的mysql示例)中,我有initDB函数,如下所示:
type MySQLDB struct {
config *config.Configuration
}
func (my *MySQLDB) initDB() {
log.Println("Getting DB Connection")
tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
if err != nil {
log.Println(err.Error())
}
db = tempdb
defer db.Close()
}
func (my *MySQLDB) FetchAll(db *sqlx.DB, table string) []DataItem {
dTable := []DataItem{}
query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
err := db.Select(&dTable, query)
if err != nil{
panic(err)
}
return dTable
}
此时我知道连接最初是打开的,但是下次调用一个函数时我得到db is closed错误。那么如何正确地共享函数之间的数据库连接,还是我真的必须在每个函数中运行连接?
答案 0 :(得分:2)
请勿在 initDB 函数中调用延迟db.Close()。执行该功能后,db也会关闭!因此,当您调用方法时,您会收到关闭的错误 也许您需要重新设计界面,例如:
type Datastore interface {
Insert(table string, item DataItem) bool
CheckEmpty(table string) bool
FetchAll(table string) []DataItem
Close() error // call this method when you want to close the connection
initDB()
}
您的 MySQLDB 工具现在看起来像:
type MySQLDB struct {
config *config.Configuration
db *sqlx.DB
}
func (my *MySQLDB) initDB() {
log.Println("Getting DB Connection")
tempdb, err := sqlx.Connect("mysql", my.config.Database.Dsn+"&parseTime=True")
if err != nil {
log.Println(err.Error())
}
my.db = tempdb
}
func (my *MySQLDB) Close() error {
return my.db.Close()
}
func (my *MySQLDB) FetchAll(table string) []DataItem {
dTable := []DataItem{}
query := "SELECT foo, bar FROM " + table + " ORDER BY last_update ASC"
err := my.db.Select(&dTable, query)
if err != nil{
panic(err)
}
return dTable
}