【问题标题】:gorm get current db connectiongorm 获取当前数据库连接
【发布时间】:2018-08-10 14:05:00
【问题描述】:

如何获取当前的数据库连接?

package main

import (
     "github.com/labstack/echo"
      "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/mysql"
   )

 func main() {
     // Echo instance
    e := echo.New()
    db, _ := gorm.Open("mysql", "root:root@/golang")
    defer db.Close()

    gorm.AutoMigrate(&user.User{})
    e.Logger.Fatal(e.Start(":4000"))
}

这是我想从数据库中获取用户的控制器

 package controllers

 import (
  "github.com/labstack/echo"
 )

  func login(c echo.Context) error {
  username := c.QueryParam("username")
  }

我怎样才能得到 db 对象或者我需要 make gorm.Open 一次?或者为 db 对象创建单例并导入它?

【问题讨论】:

    标签: go go-gorm


    【解决方案1】:

    gorm.Open 返回的 db 变量是您的 db 句柄。您只需将其作为 *gorm.DB 传递给您希望能够使用它的任何人。

    下面是一个示例,说明如何将数据库句柄正确传递给用户控制器:

    type UserRepository interface {
        Create(user model.User) error
    }
    
    type UserRepositoryMySQL struct {
        db *gorm.DB
    }
    
    // The repository you pass to your controller to provide
    // an interface with the database
    func (u *UserRepositoryMySQL) Create(user model.User) error {
        u.db.Create(&user)
        // handle errors here
        return nil
    }
    
    type UserController struct {
        users UserRepository
    }
    
    func (u *UserController) Create(ctx echo.Context) {
        var user model.User
    
        err := ctx.Bind(&user)
        // handle errors
    
        // validate user
        err := u.users.Create(user)
    }
    
    func main() {
        e := echo.New()
    
        db, _ := gorm.Open("mysql", "root:root@/golang")
        defer db.Close()
    
        userRepo := repo.UserRepositoryMySQL(db)
        userController := controller.UserController(userRepo)
        ...
    
        e.POST("/users", userController.Create)
        ...
        e.Logger.Fatal(e.Start(":4000"))
    }
    

    我建议为存储库使用一个接口,因为您以后可能希望集成多个不同的数据库,并且它可以很容易地模拟和测试您的控制器。

    【讨论】:

      【解决方案2】:

      传递连接对象有两种主要方式。创建一个全局变量并将其作为您要使用的参数传递给方法:

      var db *sql.DB
      
      func InitDB(dataSourceName string) {
          var err error
          db, err = sql.Open("postgres", dataSourceName)
          if err != nil {
              log.Panic(err)
          }
      
          if err = db.Ping(); err != nil {
              log.Panic(err)
          }
      }
      

      或者您可以在创建 db 实例后创建一个结构并将其用作方法的方法接收器。

      type DB struct {
         *sqlx.DB
      }
      
      func(db *DB) Get() (error)
      

      但它应该是初始化一次实例后在函数内部使用的指针字段。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-18
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 1970-01-01
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多