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

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

在这里插入图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值