gorm是golang下操作数据的一种orm框架,能够方便开发者进行数据库操作。其设计哲学是约定大于配置,所以在掌握此框架时,需要熟悉其中做出的约定。
插入
- 插入
// 简单插入
user := User{Name:"xx", Age: 18, Birthday: time.Now()}
result := db.Create(&user)
user.ID // 返回插入数据的主键
result.Error // 返回Error
result.RowsAffected // 返回影响的行数
- 指定插入或忽略字段
db.Select("Name", "Age", "CreatedAt").Create(&user) // Select 选择字段
db.Omit("Name", "Age", "CreatedAt").Create(&user) // Omit忽略字段
- 批量插入
var users = []User{{Name: "jinzhu1"}, {Name: "jinzhu2"}, {Name: "jinzhu3"}}
db.Create(&users)
for _, user := range users {
user.ID // 1,2,3
}
var users = []User{{name: "jinzhu_1"}, ...., {Name: "jinzhu_10000"}}
// 数量为 100
db.CreateInBatches(users, 100)
- 默认值
标签default可以为字段定义默认值。插入记录到数据库时,默认值 会被用于 填充值为 零值 的字段。对于声明了默认值的字段,像 0、''、false 等零值是不会保存到数据库。您需要使用指针类型或 Scanner/Valuer 来避免这个问题
查询
- First、Take、Last 获取一条记录。如果获取不到,则错误为
ErrRecordNotFound
- Find在查询不到数据时不会返回
ErrRecordNotFound
- First 和 Last 会根据主键排序,分别查询第一条和最后一条记录。 只有在目标 struct 是指针或者通过 db.Model() 指定 model 时,该方法才有效。如果相关 model 没有定义主键,那么将按 model 的第一个字段进行排序。
更新
- Save方法更新所有字段,即使字段是零值
- Update方法指定列,配合Where使用
- Updates更新多列
删除
- 如果包含gorm.deletedat字段,则调用Delete时会进行软删除
-
db.Unscoped().Where("age=20").Find(&users)
, 可以查询到被软删除的记录 -
db.Unscoped().Delete(&order)
, 永久删除匹配的记录
事务
- 事务使用如下:
db.Transaction(func(tx *gorm.DB) error {
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil {
// 返回任何错误都会回滚事务
return err
}
if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil {
return err
}
// 返回 nil 提交事务
return nil
}
- 嵌套事务
GORM 支持嵌套事务,您可以回滚较大事务内执行的一部分操作
db.Transaction(func(tx *gorm.DB) error {
tx.Create(&user1)
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&user2)
return errors.New("rollback user2") // Rollback user2
})
tx.Transaction(func(tx2 *gorm.DB) error {
tx2.Create(&user3)
return nil
})
return nil
})
// Commit user1, user3
- 手动事务
// 开始事务
tx := db.Begin()
// 在事务中执行一些 db 操作(从这里开始,您应该使用 'tx' 而不是 'db')
tx.Create(...)
// ...
// 遇到错误时回滚事务
tx.Rollback()
// 否则,提交事务
tx.Commit()
约定(开发过程中建议遵守这些约定)
1. 表名规则
默认情况,gorm使用ID作为主键,使用结构体名的蛇形复数
作为表名
,字段名的蛇形作为列名,并使用CreatedAt、UpdatedAt字段追踪创建、更新时间。
type User struct {
ID uint
Name string
}
上面User默认对应的数据库表名称为users
2. 默认字段
gorm中有一个默认的数据结构,集gorm.Model,结构如下
type Model struct {
ID uint `gorm:"primaryKey"`
CreatedAt time.Time
UpdateAt time.Time
DeletedAt gorm.DeleteAt `gorm:"index"`
}
所以在开发过程中建议表中有这些字段