当使用链式写法时候,后面的方法将复用前面的方法的搜索条件(不包含内联条件)
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("事务提交")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)