gorm 获取当前数据库连接

标签 go go-gorm

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

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"))
}

这里是我想从 db 获取用户的 Controller

 package controllers

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

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

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

最佳答案

gorm.Open 返回的 db 变量是您的 db 句柄。您只需将它作为 *gorm.DB 传递给任何您想要使用它的地方。

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

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"))
}

我建议为存储库使用一个接口(interface),因为您以后可能想要集成多个不同的数据库,并且它可以很容易地模拟和测试您的 Controller 。

关于gorm 获取当前数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51788283/

相关文章:

go - 为什么row.Next()取决于数据库响应率?

go - 为什么这个 golang 程序在使用带有 select 的 for 循环时卡在 Playground 上?

oop - Golang OOP 说明

json - 使用 gorm 创建记录时如何验证所属关系

go - Gorm Extra,其中1 <> 1 in many2many

http - Golang http客户端为什么有MaxConnsPerHost没有MaxConns

go - 普罗米修斯直方图矢量 : All buckets fill equally?

postgresql - GORM 创建可能已经存在的记录

database - 防止空(或数据库中的空字符串值)

go - 返回 nil 结构而不是空结构 go-gorm