gorm 获取当前数据库连接
gorm get current db connection
如何获得当前的数据库连接?
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")
}
如何获取数据库对象或者我需要再制作一次gorm.Open?或者为 db 对象创建单例并导入它?
gorm.Open
returns 是你的数据库句柄的数据库变量。你只需要将它作为 *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"))
}
我建议为存储库使用一个接口,因为您以后可能想要集成多个不同的数据库,并且它可以很容易地模拟和测试您的控制器。
传递连接对象主要有两种方式。创建一个全局变量并将其作为您要使用的参数传递给方法:
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)
但它应该是在初始化实例一次后在函数内部使用的指针字段。
如何获得当前的数据库连接?
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")
}
如何获取数据库对象或者我需要再制作一次gorm.Open?或者为 db 对象创建单例并导入它?
gorm.Open
returns 是你的数据库句柄的数据库变量。你只需要将它作为 *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"))
}
我建议为存储库使用一个接口,因为您以后可能想要集成多个不同的数据库,并且它可以很容易地模拟和测试您的控制器。
传递连接对象主要有两种方式。创建一个全局变量并将其作为您要使用的参数传递给方法:
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)
但它应该是在初始化实例一次后在函数内部使用的指针字段。