当使用链式写法时候,后面的方法将复用前面的方法的搜索条件(不包含内联条件)
db.Where("username LIKE ?", "%大旺%").Find(&users, "id IN (?)", []int{1, 2, 3}).Count(&count)
生成的数据库语句
SELECt * FROM t_user WHERe username LIKE '%大旺%' AND id IN (1, 2, 3)
SELECt count(*) FROM t_user WHERe username LIKE 'jinzhu%'
2.错误处理
gorm中的Error可以错误处理
var user User
if err := db.Table("t_user").Where("id = ?", 8).First(&user).Error; err != nil {
fmt.Println(err)
}
3.钩子
钩子是一个在 插入/查询/更新/删除 之前或之后被调用的方法。
几种钩子
//新增的钩子 BeforeSave BeforeCreate AfterCreate AfterSave BeforeSave //更新的钩子 BeforeUpdate AfterUpdate AfterSave //查询的钩子 AfterFind //删除的钩子 BeforeDelete AfterDelete
查询钩子示例
func (u *User) AfterFind() (err error) {
if u.Username == "大旺" {
println("我是查询钩子,在查询后执行")
}
return
}
4.事物
GORM 默认在事务中执行单个 create, update, delete 操作,以确保数据库数据完整性。也可以使用GORM的事物(Transaction )将多个 create、 update、delete 当成一个原子性操作。
// 开启事务 tx := db.Begin() // 在事务中执行一些数据库操作 tx.Create(...) // 发生错误回滚事务 tx.Rollback() // 或者提交这个事务 tx.Commit()
将表长度改小
更新表
// 注意在事务中要使用 tx 作为数据库句柄
tx := db.Begin()
println("begin")
defer func() {
if r := recover(); r != nil {
println("回滚")
tx.Rollback()
}
}()
if tx.Error != nil {
fmt.Println("事物开启异常")
}
if err := tx.Table("t_user").Where("id = ?", 8).Update(map[string]interface{}{"username": "大旺"}).Error; err != nil {
println("更新1回滚")
fmt.Println(err)
tx.Rollback()
}
if err := tx.Table("t_user").Where("id = ?", 8).Update(map[string]interface{}{"username": "大旺你好"}).Error; err != nil {
println("更新2回滚")
fmt.Println(err)
tx.Rollback()
}
tx.Commit()
println("事务提交")



