【发布时间】:2015-03-02 17:09:25
【问题描述】:
我想要完成的是在多个函数之间共享 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 错误。那么如何在函数之间正确共享数据库连接,或者我真的必须在每个函数中运行一个打开的连接?
【问题讨论】:
标签: go