我有一个包含以下代码的数据库包。
package database
import (
"log"
"github.com/jinzhu/gorm"
// required by gorm
_ "github.com/mattn/go-sqlite3"
)
type Podcast struct {
ID int `sql:"index"`
Title string
RssURL string `sql:"unique_index"`
Paused bool
Episodes []Episode
}
type Episode struct {
ID int `sql:"index"`
PodcastID int
Title string
EnclosureURL string `sql:"unique_index"`
Downloaded bool
GUID string `sql:"unique_index"`
PubDate string
}
func DBSession() (db gorm.DB) {
sqliteSession, err := gorm.Open("sqlite3", cache.db)
if err != nil {
log.Fatal(err)
}
return sqliteSession
}
接下来是一系列方法,所有方法都以下面的代码开头。
FindSomethingByID(id int) {
db := DBSession()
db.LogMode(false)
// code
}
FindSomethingElse {
db := DBSession()
db.LogMode(false)
// code
}
调用DBSession并在每个func中设置LogMode似乎很糟糕。我只是不知道如何做得更好。有人可以帮忙吗?
答案 0 :(得分:6)
在每个函数中调用gorm.Open
并不是非常有效:Open
打开一个新的连接池,应该只调用一次(see the database/sql docs,gorm包装)。< / p>
一个简单的改进是建立全局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
}
这是一个快速的胜利并减少重复。
在更大的应用程序中,通过将依赖关系(如DB池,配置参数等)更明确地通过将它们包装在类型中并创建自定义处理程序来实现它是有意义的。
您也可以初始化package main
中的连接,并通过设置私有包级变量的*gorm.DB
函数将database
传递给您的func New(db *gorm.DB)
包。
答案 1 :(得分:0)
最明显的简化是将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会话,一个简单的函数调用。如果你总是需要一个新的数据库会话,你不能真正缩短它。