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"))
}
这是我想从数据库获取用户的控制器
package controllers
import (
"github.com/labstack/echo"
)
func login(c echo.Context) error {
username := c.QueryParam("username")
}
我怎样才能得到 db 对象或者我需要 make gorm.Open 一次?或者为 db 对象创建单例并导入它?
解决方案
返回的 db 变量gorm.Open
是您的 db 句柄。您只需要将它作为 a 传递*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"))
}
我建议为存储库使用一个接口,因为稍后您可能希望集成多个不同的数据库,并且它可以很容易地模拟和测试您的控制器。
推荐阅读
- python - 如何在 matplotlib 中创建径向热图?
- javascript - 多个验证函数被视为 OR 而不是 AND
- php - 我的联系公式以前工作过 - 现在不行 - php
- tensorflow - tf.while_loop 每次迭代具有灵活的行数
- typescript - 在类型扩展中获取属性类型
- angularjs - 如何对托管在 azure 上的 Angular Web 应用和 .net Web api 使用 google 身份验证
- javascript - 使用 Firebase FCM 反应原生
- typescript - Observable 'save' 应该返回 EMPTY 或一个虚拟值
- python-3.x - 如何在 Python3 中将 pandas 数据帧的数据类型从 str 转换为 float?
- r - Azure ML R 脚本选择 Web 服务中得分最高的标签