如何干掉数据库代码

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


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


呼啦一阵风
浏览 163回答 2
2回答

元芳怎么了

gorm.Open在每个函数内部调用并不是很有效:Open打开一个新的连接池,并且应该只调用一次(请参阅gorm 包装的 database/sql 文档)。一个简单的改进是建立一个全局gorm.DB,init() 从你的所有函数中初始化它- 例如package databasevar db gorm.DBfunc 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)。

杨__羊羊

最明显的简化是将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 行,这是一个简单的函数调用。如果你总是需要一个新的数据库会话,你真的不能让它更短。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go