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_atvalue 值为业务需要的默认删除时间即可,我这里为了简单就直接替换了整个数组。

源码分析

有哪些官方自带的callback

上文中添加自定义 callback 也是根据这个默认的来加,通过 Before() After() 控制顺序。

如何设置的删除参数

因为这里实现了 QueryClauses() []clause.Interface 方法,所以实现了:

哪里设置

可以看到四种类型的 Clause 都是在这里设置的,通过对字段进行断言。

哪里拼接

最后更新于

这有帮助吗?