• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    gorm FirstOrCreate和受影响的行数实例

    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。

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

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • gorm update传入struct对象,零值字段不更新的解决方案
    • gorm操作MySql数据库的方法
    • Go基于GORM 获取当前请求所执行的 SQL 信息(思路详解)
    • Golang 使用gorm添加数据库排他锁,for update
    • golang Gorm与数据库完整性约束详解
    • golang gorm 结构体的表字段缺省值设置方式
    • golang gorm 计算字段和获取sum()值的实现
    • 解决Go gorm踩过的坑
    上一篇:浅谈Go语言的error类型
    下一篇:golang gorm 计算字段和获取sum()值的实现
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    gorm FirstOrCreate和受影响的行数实例 gorm,FirstOrCreate,和,受影,