1 回答

TA貢獻1842條經(jīng)驗 獲得超13個贊
首先,如果你想從另一個包中訪問某些東西,它必須被導(dǎo)出。在 Go 中,如果你想導(dǎo)出一些東西,你可以用首字母大寫來命名它(在你的例子中,它應(yīng)該Conn代替conn)。
其次,當(dāng)你使用它時,defer它會在函數(shù)返回時被執(zhí)行。在您的情況下,它會立即返回,因此連接會立即關(guān)閉。
解決方案:
var Conn *sql.DB
func InitFirebird() {
? ? var (
? ? ? ? dbDriver? ?= beego.AppConfig.String("DB_CONNECTION")
? ? ? ? dbUsername = beego.AppConfig.String("DB_USERNAME")
? ? ? ? dbPassword = beego.AppConfig.String("DB_PASSWORD")
? ? ? ? dbServer? ?= beego.AppConfig.String("DB_HOST")
? ? ? ? // dbPort? ? ?= beego.AppConfig.String("DB_PORT")
? ? ? ? dbFileName = beego.AppConfig.String("DB_DATABASE")
? ? )
? ? Conn, _ = sql.Open(dbDriver, dbUsername+":"+dbPassword+"@"+dbServer+"/"+dbFileName)
}
現(xiàn)在在你的主包中:
func init() {
? ? utils.InitFirebird()
}
func main() {
? ? if beego.BConfig.RunMode == "dev" {
? ? ? ? beego.BConfig.WebConfig.DirectoryIndex = true
? ? ? ? beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
? ? ? ? }
? ? var n int
? ? defer utils.Conn.Close() // <-- Close here
? ? utils.Conn.QueryRow("SELECT Count(*) FROM rdb$relations").Scan(&n)
? ? fmt.Println("Relations count=", n)
? ? beego.Run()
}
這里Close()不會立即執(zhí)行,因為beego.Run()會阻塞。
PS: 不推薦使用全局變量傳遞數(shù)據(jù)庫連接。
- 1 回答
- 0 關(guān)注
- 157 瀏覽
添加回答
舉報