怎么在gorm中使用FirstOrCreate
创始人
2024-12-26 19:02:54
0次

FirstOrCreate

获取第一个匹配的记录,或创建一个具有给定条件的新记录(仅适用于struct, map条件)

db.Where(User{Name: "Jinzhu"}).FirstOrCreate(&user)

代码案例:

func (tsu *TopicSignUp) TopicSignUpCreate() (bool, int64) {
 db := Db.Where(tsu).FirstOrCreate(&tsu)
 if err := db.Error; err != nil {
 return false, 0
 }
 //返回执行结果受影响的行数
 return true, db.RowsAffected
}

补充:gorm踩坑:软删除与某个字段的唯一性

有一个user_infos表,用户名唯一。我在model定义user_name的时候已经使用gorm的tag标记为unique_index。类似如下:

type UserInfo struct {
 Id uint `json:id`
 Created_at tine.Time `josn:"created_at"`
 Updated_at time.Time  `json:"updated_at"`
 DeletedAt *time.Time `json:"deleted_at"`
 UserName string `gorm:"unique_index, not null" json:"user_name"`
}

需求如下:

这个用户允许删除,但是又不能真正从db删掉。

gorm的model如果有deleted_at字段,会默认执行软删除。所谓的软删除也就是把deleted_at置为当前时间,该记录并不会从db删除。

gorm查询的时候,如果你有仔细查看打印的sql语句。你会发现,每个查询语句都会有一个自带的条件:

where deleted_at is null

也就是说,gorm查询的时候是不会去查询那些已经被软删除的记录的,哪怕你在你的查询语句里面手动加上

where deleted_at is not null

也是无法查询到的,我试过了,你也可以试试。这也就是软删除的作用,查询是查不到的。

那么问题就来了,我的user_infos表要求用户名唯一。每次Create记录的时候,如果之前已经存在一条已经被软删除的记录,并且被软删除的记录的user_name与当前新增的记录的user_name相同,那么会无法新增成功。

报错类似如下(因为昨天在公司遇到的,今天周末在家整理,无法上图,等周一可以再来上图)。

duplicate key for ...

其实问题就出在软删除的记录那里。

解决:

为了保证以后这条被软删除的记录还能找到(硬删除就真的再也找不到了),于是就在执行软删的时候不调用Delete方法,而是调用Update方法,设置deleted_at为当前时间,并且把需要保持唯一性的字段,比如我这里的用户名,在原来的用户名后面加了个时间标记。

如以前的用户名是张三,现在我删除的时间是2018-09-15 11:13:06 ,那么我最终将需要删掉的这条记录的用户名设置为张三2018-09-15 11:13:06。

当然这只是个标记而已,你也可以添加你自己的标记,反正最终目的就是为了保证以后这条记录能被找到。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...