2 回答

TA貢獻1818條經驗 獲得超11個贊
我認為您的問題是由于您使用了操作員db,Connect()范圍被遮蔽了:=。如果你改變你的方法來聲明一個dberrvar:
func Connect() {
var dberr error
db, dberr = sql.Open(“<CONNECTION_STRING>“)
if dberr != nil {
fmt.Println(dberr)
}
}
您的代碼將按預期工作

TA貢獻1829條經驗 獲得超9個贊
您超出范圍是因為您正在通過db, err :=
賦值創建一個局部變量 db?,然后在 Connect func 返回時超出范圍。
一般就使用sql.DB
從database/sql 包:
DB 是表示零個或多個底層連接池的數據庫句柄。多個 goroutine 并發使用是安全的。
sql 包自動創建和釋放連接;它還維護一個空閑連接的空閑池。
和
返回的數據庫對于多個 goroutine 并發使用是安全的,并維護自己的空閑連接池。因此,應該只調用一次 Open 函數。很少需要關閉數據庫。
也就是說,您想打開連接一次,然后在整個過程中保持打開狀態。這樣,當您完成(或遇到致命或恐慌)時實際關閉它的唯一可靠方法是defer db.Close()
在打開它后立即執行慣用的 go?,這需要在主函數中完成。
您仍然可以將 Connect 函數保留在您的包中,并使用它來初始化全局包變量 db,但從 main 調用一次并將 *sql.DB 返回到 main,以便您可以延遲 db.Close()。
- 2 回答
- 0 關注
- 271 瀏覽
添加回答
舉報