如何干掉数据库代码

时间:2015-07-03 20:24:25

标签: go

我有一个包含以下代码的数据库包。

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似乎很糟糕。我只是不知道如何做得更好。有人可以帮忙吗?

2 个答案:

答案 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会话,一个简单的函数调用。如果你总是需要一个新的数据库会话,你不能真正缩短它。