golang gorm的Callbacks事务回滚对象操作示例

作者:Jeff的技术栈 时间:2024-04-25 13:18:42 

1. Callbacks

您可以将回调方法定义为模型结构的指针,在创建,更新,查询,删除时将被调用,如果任何回调返回错误,gorm将停止未来操作并回滚所有更改。

1.1. 创建对象

创建过程中可用的回调

// begin transaction 开始事物
BeforeSave
BeforeCreate
// save before associations 保存前关联
// update timestamp `CreatedAt`, `UpdatedAt` 更新`CreatedAt`, `UpdatedAt`时间戳
// save self 保存自己
// reload fields that have default value and its value is blank 重新加载具有默认值且其值为空的字段
// save after associations 保存后关联
AfterCreate
AfterSave
// commit or rollback transaction 提交或回滚事务

1.2. 更新对象

更新过程中可用的回调

// begin transaction 开始事物
BeforeSave
BeforeUpdate
// save before associations 保存前关联
// update timestamp `UpdatedAt` 更新`UpdatedAt`时间戳
// save self 保存自己
// save after associations 保存后关联
AfterUpdate
AfterSave
// commit or rollback transaction 提交或回滚事务

1.3. 删除对象

删除过程中可用的回调

// begin transaction 开始事物
BeforeDelete
// delete self 删除自己
AfterDelete
// commit or rollback transaction 提交或回滚事务

1.4. 查询对象

查询过程中可用的回调

// load data from database 从数据库加载数据
// Preloading (edger loading) 预加载(加载)
AfterFind

1.5. 回调示例

func (u *User) BeforeUpdate() (err error) {
   if u.readonly() {
       err = errors.New("read only user")
   }
   return
}
// 如果用户ID大于1000,则回滚插入
func (u *User) AfterCreate() (err error) {
   if (u.Id > 1000) {
       err = errors.New("user id is already greater than 1000")
   }
   return
}

gorm中的保存/删除操作正在事务中运行,因此在该事务中所做的更改不可见,除非提交。

如果要在回调中使用这些更改,则需要在同一事务中运行SQL。

所以你需要传递当前事务到回调,像这样:

func (u *User) AfterCreate(tx *gorm.DB) (err error) {
   tx.Model(u).Update("role", "admin")
   return
}
func (u *User) AfterCreate(scope *gorm.Scope) (err error) {
 scope.DB().Model(u).Update("role", "admin")
   return
}

来源:https://www.cnblogs.com/guyouyin123/p/14115408.html

标签:golang,gorm,Callbacks,事务回滚
0
投稿

猜你喜欢

  • Python+matplotlib实现堆叠图的绘制

    2023-07-21 17:38:35
  • javascript中的面向对象

    2024-04-18 10:54:33
  • 解决python3 requests headers参数不能有中文的问题

    2021-11-04 21:18:42
  • 浅谈Go语言中的结构体struct & 接口Interface & 反射

    2024-05-22 10:30:50
  • 详解解决Python memory error的问题(四种解决方案)

    2021-03-11 14:59:11
  • 浅谈pytorch卷积核大小的设置对全连接神经元的影响

    2022-08-19 04:49:55
  • Vue实例中生命周期created和mounted的区别详解

    2024-04-29 13:08:15
  • Python Web框架Tornado运行和部署

    2021-04-14 09:17:57
  • 在VS2019环境下使用Opencv调用GPU版本YOLOv4算法的详细过程

    2023-05-12 10:50:46
  • go语言通过反射创建结构体、赋值、并调用对应的操作

    2024-03-16 15:52:47
  • Js 随机数产生6位数字

    2024-05-02 17:31:03
  • JavaScript实现烟花特效(面向对象)

    2024-02-26 22:44:50
  • Pytorch搭建SRGAN平台提升图片超分辨率

    2022-10-03 14:02:01
  • Python3实现的Mysql数据库操作封装类

    2024-01-20 23:57:36
  • python启动办公软件进程(word、excel、ppt、以及wps的et、wps、wpp)

    2022-06-12 23:09:48
  • Oracle 查询表信息获取表字段及字段注释

    2024-01-14 14:46:36
  • 使用Pyhton集合set()实现成果查漏的例子

    2023-10-20 17:49:00
  • 利用XMLHTTP批量生成静态页的函数

    2008-09-10 11:07:00
  • python创建一个最简单http webserver服务器的方法

    2021-12-15 03:45:40
  • Go/Python/Erlang编程语言对比分析及示例代码

    2022-08-15 17:19:12
  • asp之家 网络编程 m.aspxhome.com