亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何干掉數據庫代碼

如何干掉數據庫代碼

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 關注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號