鍍金池/ 問(wèn)答/GO  網(wǎng)絡(luò)安全/ gorm 使用問(wèn)題

gorm 使用問(wèn)題

|
model
--model.go
main.go

// main.go 

func main () {
   gin.Run() // 啟動(dòng)web服務(wù)器
}

// model.go 

var Db *gorm.DB
func init(){
  Db , err := gorm.Open('mysql','DSN = root:root@/hongjiu?charset=utf8&parseTime=True&loc=Local')
  defer Db.Close() // 這里關(guān)了連接還怎么使用呢?
}
回答
編輯回答
骨殘心

defer關(guān)鍵字在 golang 中用于延遲執(zhí)行一個(gè)函數(shù),不是立即執(zhí)行的
會(huì)在你程序退出時(shí)執(zhí)行

2017年1月15日 06:07
編輯回答
熟稔

不關(guān)就是了,我的所有連接都這樣
什么memcache,mysql,rabbitmq
要活學(xué)活用

2017年7月14日 06:08
編輯回答
瞄小懶

你應(yīng)該把它寫(xiě)在main函數(shù)里。比如:

func init(){
    //init用來(lái)執(zhí)行初始化操作,比如db.AutoMigrate(),也可以不要
    //此處的DB生命周期和init的周期相同,初始化玩db就被銷(xiāo)毀。
    openDB()
    defer closeDB()
    initDB()
}
func main(){
    //每個(gè)打開(kāi)的DB跟著main函數(shù)的生命周期
    openDB()
    defer closeDB()
    MAIN()
}

雖然不關(guān)也沒(méi)什么問(wèn)題,不過(guò)能做的更好為什么不做呢?


實(shí)例:

package main
import(
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
)
var db *gorm.DB

func openDB() {
    var err error
    db, err = gorm.Open(dbType, dbAddress)
    checkErrFatal(err)
}

func closeDB() {
    db.Close()
}

func init(){
    openDB()
    defer closeDB()

    log.Println("Init tables")
    db.AutoMigrate(&User{})
}
func main(){
    openDB()
    defer closeDB()
    query()
}

func query() int {
    var count int = 0 
    db.Where("name = ?", user).Find(&users).Count(&count)
    return count
}

2017年8月26日 05:11
編輯回答
臭榴蓮

你把defer db.Close()放到main函數(shù)里面就好了,只有main函數(shù)結(jié)束的時(shí)候才執(zhí)行close方法

2017年3月23日 10:36
編輯回答
玄鳥(niǎo)

額,不要關(guān),可以接收退出的信號(hào)關(guān)閉
上面的說(shuō)錯(cuò)了,defer是函數(shù)級(jí)的。

2017年8月18日 23:36