GORM是使用Go语言开发的友好的ORM库。
go get -u github.com/jinzhu/gorm
go get -u gorm.io/gorm
通用数据库接口sql.DB
从*gorm.DB
连接获取通用数据库接口*sql.DB
// 获取通用数据库对象`*sql.DB`以使用其函数
db.DB()
// Ping
db.DB().Ping()
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)
将多个字段设置为主键以启用复合主键
type Product struct {
ID string `gorm:"primary_key"`
LanguageCode string `gorm:"primary_key"`
}
Gorm有内置的日志记录器支持,默认情况下,它会打印发生的错误
// 启用Logger,显示详细日志
db.LogMode(true)
// 禁用日志记录器,不显示任何日志
db.LogMode(false)
// 调试单个操作,显示此操作的详细日志
db.Debug().Where("name = ?", "jinzhu").First(&User{})
参考GORM的默认记录器如何自定义它https://github.com/jinzhu/gorm/blob/master/logger.go
db.SetLogger(gorm.Logger{revel.TRACE})
db.SetLogger(log.New(os.Stdout, "\r\n", 0))
Gorm使用可链接的API,*gorm.DB
是链的桥梁,对于每个链API,它将创建一个新的关系。
db, err := gorm.Open("postgres", "user=gorm dbname=gorm sslmode=disable")
// 创建新关系
db = db.Where("name = ?", "jinzhu")
// 过滤更多
if SomeCondition {
db = db.Where("age = ?", 20)
} else {
db = db.Where("age = ?", 30)
}
if YetAnotherCondition {
db = db.Where("active = ?", 1)
}
当我们开始执行任何操作时,GORM将基于当前的*gorm.DB
创建一个新的*gorm.Scope
实例
// 执行查询操作
db.First(&user)
并且基于当前操作的类型,它将调用注册的creating,updating,querying,deleting或row_querying回调来运行操作。
基本用法示例:
package main
import (
"fmt"
_ "github.com/jinzhu/gorm/dialects/mysql"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// User 用户信息
type User struct {
ID uint
Name string
Gender int
Age int
}
func CreateUsers(db *gorm.DB) error {
// 再唠叨一下,事务一旦开始,你就应该使用 tx 处理数据
tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
}
}()
if err := tx.Error; err != nil {
return err
}
if err := tx.Create(&User{8, "枯藤", 1, 21}).Error; err != nil {
tx.Rollback()
return err
}
if err := tx.Create(&User{8, "枯藤", 1, 21}).Error; err != nil {
tx.Rollback()
return err
}
return tx.Commit().Error
}
func main() {
dsn := "root:root@tcp(127.0.0.1:3306)/beego?charset=utf8mb4"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
fmt.Println(err)
panic(err)
}
// u1 := User{8, "枯藤", 1, 21}
// u2 := User{9, "topgoer.com", 0, 22}
// fmt.Println(u1)
// // 创建记录
// db.Create(&u1)
// db.Create(&u2)
// 查询
var u = new(User)
db.First(u)
fmt.Printf("%#v\n", u)
var uu User
db.Find(&uu, "age=?", 22)
fmt.Printf("%#v\n", uu)
// 查询多个
result := map[string]interface{}{}
db.Model(&User{}).First(&result, "id = ?", 1)
fmt.Println(result)
var results []map[string]interface{}
db.Table("users").Find(&results)
fmt.Println(results)
// 更新
// db.Model(&u).Update("age", 31)
// // 删除
// db.Delete(&u)
//开始事务
CreateUsers(db)
var user *User
if err := db.Where("name = ?", "jinzhu").First(&user).Error; err != nil {
fmt.Println(err)
// 错误处理...
}
// // 如果有多个错误发生,用`GetErrors`获取所有的错误,它返回`[]error`
// db.First(&user).Limit(10).Find(&users).GetErrors()
// // 检查是否返回RecordNotFound错误
// db.Where("name = ?", "hello world").First(&user).RecordNotFound()
// if db.Model(&user).Related(&credit_card).RecordNotFound() {
// // 没有信用卡被发现处理...
// }
}