众所周知,我们在用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