Gorm 升级 V2 使用记录
v1 升级到 v2 + 软删除使用采坑贴
背景
最近给之前的 gorm v1 升级到了 v2,基本上全线不能使用,这里记录下升级的变化点。
查询
查询结果不存在情况
v1中是有不存在异常的
var (
// ErrRecordNotFound returns a "record not found error". Occurs only when attempting to query the database with a struct; querying with a slice won't return this error
ErrRecordNotFound = errors.New("record not found")
......
)在 v2 下查询是如下结果:

并没有 Error 出现,之前 v1 如果数据不存在是会有个 Error 信息。
保持之前的使用习惯,添加如下代码:
这样查询如果没有数据,结果会是如下:

如果认为找不到数据不应该出现异常,那么可以根据 RowsAffected 来返回 true|false。
查询数量
由之前的 int 改为了 int64
软删除
gorm 的软删除默认是 deleted_at 字段,值为 NULL,即插入的时候 deleted_at 为 NULL,查找的时候带上 WHERE deleted_at = NULL。
改进
插入的时候加默认值
插入的时候自动填充 deleted_at 字段为默认字段
通过 BeforeCreate 方法在查询的时候自动添加 deleted_at 为默认字段。
运行插入测试代码:
输出 SQL:
删除的时候软删除
运行删除测试代码:
发现并不是软删除,输出 SQL 如下:
查看了官方的 gorm.Model 对象,在 v1是只需要有这个字段,v2 升级后,变成了如下对象:
于是基本对象和创建的时候设置时间的代码改为:
再运行删除,输出 SQL
查找的时候带默认删除时间
核心就是修改下图红色的值

暴力实现:
在进行 query 这个 callback 之前修改 db.Statement.Schema.QueryClauses 里面 deleted_at 的 value 值为业务需要的默认删除时间即可,我这里为了简单就直接替换了整个数组。
源码分析
有哪些官方自带的callback
上文中添加自定义 callback 也是根据这个默认的来加,通过 Before() 或 After() 控制顺序。
如何设置的删除参数
因为这里实现了 QueryClauses() []clause.Interface 方法,所以实现了:
哪里设置
可以看到四种类型的 Clause 都是在这里设置的,通过对字段进行断言。
哪里拼接
最后更新于
这有帮助吗?