gorm 使用问题

|
model
--model.go
main.go

// main.go 

func main () {
   gin.Run() // 启动web服务器
}

// 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() // 这里关了连接还怎么使用呢?
}
阅读 8.9k
5 个回答

额,不要关,可以接收退出的信号关闭
上面的说错了,defer是函数级的。

不关就是了,我的所有连接都这样
什么memcache,mysql,rabbitmq
要活学活用

你应该把它写在main函数里。比如:

func init(){
    //init用来执行初始化操作,比如db.AutoMigrate(),也可以不要
    //此处的DB生命周期和init的周期相同,初始化玩db就被销毁。
    openDB()
    defer closeDB()
    initDB()
}
func main(){
    //每个打开的DB跟着main函数的生命周期
    openDB()
    defer closeDB()
    MAIN()
}

虽然不关也没什么问题,不过能做的更好为什么不做呢?


实例:

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
}

你把defer db.Close()放到main函数里面就好了,只有main函数结束的时候才执行close方法

defer关键字在 golang 中用于延迟执行一个函数,不是立即执行的
会在你程序退出时执行

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题