如何干掉数据库代码

gre*_*egf 2 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
}
Run Code Online (Sandbox Code Playgroud)

接下来是一堆方法,所有方法都以下面的代码开头.

FindSomethingByID(id int) {
    db := DBSession()
    db.LogMode(false)

    // code
}

FindSomethingElse {
    db := DBSession()
    db.LogMode(false)

    // code
}
Run Code Online (Sandbox Code Playgroud)

调用DBSession并在每个func中设置LogMode似乎很糟糕.我只是不知道如何做得更好.有人可以帮忙吗?

eli*_*rar 6

gorm.Open在每个函数内部调用效率不高:Open打开一个新的连接池,应该只调用一次(参见数据库/ sql文档,gorm包装).

一个简单的改进是建立一个全局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
}
Run Code Online (Sandbox Code Playgroud)

这是一个快速的胜利,减少了重复.

在更大的应用程序中,通过将它们包装在类型中并创建自定义处理程序来更明确地传递依赖项(如DB池,配置参数等)通常是有意义的.

您也可以初始化您的连接,package main并通过设置私有包级变量的函数传递*gorm.DB给您的databasefunc New(db *gorm.DB).