记录gorm union和软删除一起使用遇到的一个奇怪问题

在使用GORM进行Go web开发时,遇到一个问题:当结合UNION操作并触发软删除时,GORM生成的SQL出现语法错误。文章详细描述了GORM的软删除机制,指出在特定情况下,由于多余的括号导致SQL执行失败。作者在生产环境(TiDB)中遇到此问题,而在测试环境(MySQL)则未报错。为解决此问题,作者选择了避免使用软删除,并给出了代码示例。同时,已向GORM官方报告此bug并分享了issue链接。
摘要由CSDN通过智能技术生成

众所周知,我们在用go写web服务的时候,gorm是我们最常用的一个orm框架。最近我却遇到了一个奇怪的问题,当我在使用union的时候,如果触发了gorm的软删除的话,最终gorm帮我们执行的sql会有语法错误。

首先在这里我先介绍下gorm的软删除:gorm文档

软删除

如果一个 model 有 DeletedAt 字段,他将自动获得软删除的功能! 当调用 Delete 方法时, 记录不会真正的从数据库中被删除, 只会将DeletedAt 字段的值会被设置为当前时间。

db.Delete(&user)
 UPDATE users SET deleted_at="2013-10-29 10:23" WHERE id = 111;

// 批量删除
db.Where("age = ?", 20).Delete(&User{
   })
 UPDATE users SET deleted_at="2013-10-29 10:23" WHERE age = 20;

// 查询记录时会忽略被软删除的记录(这里如果我使用了union,那么就会有奇怪的语法错误,见下文)
db.Where("age = 20").Find(&user)
 SELECT * FROM users WHERE age = 20 AND deleted_at IS NULL;

// Unscoped 方法可以查询被软删除的记录
db.Unscoped
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值