GO gorm踩坑记
一. 软删除问题
1. 问题描述
gorm调用delete删除数据时,默认底层调用update方法,将delete_at设置为当前时间
user表中name字段为唯一,这个用户允许删除
每次Create记录的时候,如果之前已经存在一条已经被软删除的记录,并且被软删除的记录的name与当前新增的记录的name相同
那么在验证name是否存在的时候,select 就无法查到被软删除的记录,导致验证通过了新增失败的问题
2. 解决方案:
两种解决方案: Unscoped()
2.1. 物理删除:
db.Unscoped().Where("id = ?", 1).Delete(&User{})
2.2. 筛选查询:
db.Unscoped().Where("name=?", name).Find(&User{})
二. 分页问题
1. 问题描述:
db.Where().Find(&data).Limit(limit).Offset(offset).Count(&total) // 这段代码会出现奇怪的错误:总条数查不到等等
2. 解决方案
db.Where().Find(&data).Count(&total).Limit(limit).Offset(offset) // 将Count 放在 分页前
三. 查询问题
1. 问题描述:
db.First(&User{}) // 如果没有记录则会返回error: RecordNotFound
db.Find(&User{}) // 如果没有记录则会返回error: RecordNotFound
2. 解决方案
两种解决方案:
2.1. 接受err并判断err是否为 RecordNotFound
2.2. 传递切片:
var user []User
db.Find(user)