go的GORM的链式 *** 作、错误处理、钩子、事务

go的GORM的链式 *** 作、错误处理、钩子、事务,第1张

1.链式 *** 作

当使用链式写法时候,后面的方法将复用前面的方法的搜索条件(不包含内联条件)

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("事务提交")

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/990273.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存