golang gorm的Callbacks事务回滚对象操作示例
作者:Jeff的技术栈 发布时间:2024-04-25 13:18:42
标签:golang,gorm,Callbacks,事务回滚
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


猜你喜欢
- Oracle的分析函数功能非常强大,工作这些年来经常用到。这次将平时经常使用到的分析函数整理出来,以备日后查看。我们拿案例来学习,这样理解起
- Oracle数据库升级也并非简单的事,这篇文章对Oracle那点事做了较详细的介绍:Oracle数据库升级或数据迁移方法研究我还属于Orac
- 今天简单的学了一下js运动动画,记录一下自己的心得体会,分享给大家。 下面是我整
- 第一步、在detect.py中177行左右,cv.imshow(str(p),im0)之前加上:cv2.putText(im0,f"
- 在pandas 基础操作大全之数据读取&清洗&分析 以及 pandas基础操作大全之数据合并 中介绍了p
- Hello 大家好,我是TANZAME,我们又见面了。NuGet是什么这里就不再重复啰嗦,园子里一搜一大把。今天要跟大家分享的是,在日常开发
- 本文详细讲述了CI框架整合smarty步骤。分享给大家供大家参考,具体如下:Ci结合smarty的配置步骤:1. 第一步配置ci和下载sma
- 本文为Django项目创建的简单介绍,更为详细的Django项目创建,可以参考如下教程:Django入门与实践-https://www.jb
- Ansible Inventory 介绍Ansible Inventory 是包含静态 Inventory 和动态 Invent
- 导言篇我的python环境是:python3.6.5这里我选择的GUI编程包是:tkintertkinker在python2.5以后就是自带
- 当服务端对http的body进行解析到map[string]interface{}时,会出现cli传递的是int类型,而服务端只能断言成fl
- 从某个页面表单中取出信息是ASP编程中常见的问题。但是,遍历通过表单传递的记录会花去多长时间呢?这取决于数据库的大小。简单的GUI界面都可能
- 一、定位 oracle分两大块,一块是开发,一块是管理。开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做f
- 转自http://rookiefly.cn/detail/69作死小能手这两天闲着没事,把自己电脑重装了,然而重装过后配置开发环境踩了一些坑
- 例子:以百度文库中选择文档的类型为例问题一:遍历点击所有文档类型的单选框# coding=utf-8from selenium import
- 今天无意在坛子里看到这样一个求救帖(这里),看了一下,感觉问题比较好解决。但是问题背后的问题却引起了我的反思。把他的页面整理一下看看(为了便
- 建立一个数据库表维护规范在一个定期基础而非等到问题出现才实施数据库表的检查是一个好主意。应该考虑到建立一个预防性维护的时间表,以协助自动问题
- 简介在Python开发和测试过程中主要有两种模式可以选择:脚本模式、命令行模式。在代码的开发和调试过程中使用脚本模式很方便,目前比较主流的命
- 最近开始学习Python编程,遇到scatter函数,感觉里面的参数不知道什么意思于是查资料,最后总结如下:1、scatter函数原型2、其
- 前言学习一门新的语言肯定是要从他的基本语法开始,语法构成了整个程序设计的基础,从语法中我们也可以看到这门语言的一些特性,但是话说回来,语法这