2 回答

TA貢獻1798條經驗 獲得超7個贊
gorm.Open在每個函數內部調用并不是很有效:Open打開一個新的連接池,并且應該只調用一次(請參閱gorm 包裝的 database/sql 文檔)。
一個簡單的改進是建立一個全局gorm.DB,init() 從你的所有函數中初始化它- 例如
package database
var db gorm.DB
func init() {
var err error
// Note we use an = and not a := as our variables
// are already initialised
db, err = gorm.Open("sqlite3", "cache.db")
if err != nil {
log.Fatal(err)
}
// Turn off logging globally
db.LogMode(false)
}
FindSomethingByID(id int) {
err := db.Query("...")
// code
}
這是一個快速的勝利并減少了重復。
在較大的應用程序中,通過將依賴項(如數據庫池、配置參數等)包裝在類型中并創建自定義處理程序來更明確地傳遞它們通常是有意義的。
您還可以初始化您的連接package main并通過設置私有包級變量的函數將其傳遞*gorm.DB給您的database包func New(db *gorm.DB)。

TA貢獻1943條經驗 獲得超7個贊
最明顯的簡化是將db.LogMode(false)調用移動到DBSession()函數中,并給出DBSession()一個較短的名稱,如DB():
func DB() (db gorm.DB) {
sqliteSession, err := gorm.Open("sqlite3", cache.db)
if err != nil {
log.Fatal(err)
}
sqliteSession.LogMode(false)
return sqliteSession
}
并使用它:
FindSomethingByID(id int) {
db := DB()
// code
}
現在,使用 db 會話的每個函數中只有 1 行,這是一個簡單的函數調用。如果你總是需要一個新的數據庫會話,你真的不能讓它更短。
- 2 回答
- 0 關注
- 199 瀏覽
添加回答
舉報