Gorm select 表里所有数据包括已经软删除的数据

更新日期: 2023-05-12 阅读次数: 998 字数: 294 分类: golang

又写了一天的 bug ... 被 ORM 折腾死。

没关系,又活了一天,已经很厉害了。。。

Bug 的根源

一个设备信息管理系统的表,里面会自动给设备生成设备 ID。

格式:

  • 前6位为生产如期,如:211207,代表 2021年12月7日生产。
  • 后3位为生产编号,如:001,代表当日生产的第一台设备。

编号的生成逻辑:

  • sql like 取最新的一条 满足 211207 的记录,如果有,就判断最后三位 + 1
  • 没有,就生成一条 001

这个逻辑跑了很久都没有出问题,但是今天在写一个新系统时,我偷懒 copy 过来了。

然后,另一个 bug 导致几条设备信息被软删除 (gorm 默认是使用软删除)。

于是获取到的最新一条记录,实现并不是最新的记录,因为隐藏了被软删除的设备记录。而设备 ID 又加了唯一索引,于是就再也插不进新的设备信息了。。。

gorm Unscoped

解决方法是加上 Unscoped

db.Unscoped().Where("age = 20").Find(&users)

这样无论是软删除的,还是没删除的,都能获取到。

tags: gorm

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式