为了账号安全,请及时绑定邮箱和手机立即绑定

如何干掉数据库代码

如何干掉数据库代码

Go
呼啦一阵风 2021-10-18 16:43:49
我有一个包含以下代码的数据库包。package databaseimport (    "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 似乎很糟糕。我只是不知道如何做得更好。有人可以帮忙吗?
查看完整描述

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)。


查看完整回答
反对 回复 2021-10-18
?
杨__羊羊

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


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 162 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信