dongsao8279 2018-06-08 00:23
浏览 128
已采纳

如何从另一个文件或包导入gorm db连接

I'm learning go and I've recently learned how to leverage gorm to connect to a database. I can't figure out how to import said connection. Only open and defer it's closing in the scope of the func main()

What I have currently:

func main(){
  db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
  defer db.Close()
}

This works fine and I can create tables and do CRUD ... but all in the main function.

Is there anyway I can do something like this(it didn't work) and use it in main:

func db(){
  db, _ := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
  defer db.Close()
  return db
}

Or define some kind of package that will also allow me to do this.

I know that defer will basically just close the connect once db returns, but hopefully you guys get what I'm going for.

  • 写回答

1条回答 默认 最新

  • 普通网友 2018-06-08 01:51
    关注

    Create a package to hold the database value:

    package db
    
    import "github.com/jinzhu/gorm"
    
    var DB *gorm.DB
    
    func Open() error {
       var err error
       DB, err = gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
       if err != nil {
           return err
       }
    }
    
    func Close() error {
      return DB.Close()
    }
    

    In main(), open the database and close it on return:

    package main
    
    import (
        "import/path/of/package/db"
    )
    
    func main() {
        if err := db.Open(); err != nil {
           // handle error
        }
        defer db.Close()
        ... do stuff
    }
    

    Any package can import the db package and access the database as db.DB.

    package foo 
    
    import (
        "import/path/of/package/db"
    )
    
    func doSomethignWithDB() {
       db.DB.Query("hello")
    }
    

    Another approach is to use what you currently have working. Open the database in main and pass it to the functions that need it:

    import "github.com/jinzhu/gorm"
    
    func main(){
      db, err := gorm.Open("postgres", "host=localhost port=5432 user=someUser dbname=someDB password=somePW sslmode=disable")
      if err != nil {
         // handle err
      }
      defer db.Close()
      doSomethingWithDB(db)
    }
    
    func doSomethingWithDB(db *gorm.DB) {
      ...
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况