有一个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软删除_gorm踩坑:软删除与某个字段的唯一性相关推荐

  1. ant design pro入门踩坑:删除页面文件报错

    前提:用ant design pro新增注册页,没有显示在菜单,在项目Page文件夹删除 原因:配置路由没有删 总结: 手动删除页面需要删1.Page目录下的页面文件 2.src/Page/.umi/ ...

  2. vue项目回车删除数据(踩坑记录)

    今天改bug的时候,产品说删除数据需要点击回车(enter)键进行删除 于是我先在组件中注入了监听键盘按键的事件 created() {//监听键盘按下事件window.addEventListene ...

  3. 电脑如何安装双系统 Windows10 和fedora+成功安装+踩坑记-删除EFI文件

    – 安装介绍 博主采用的是Windows10 + fedora (linux) 模式 对于系统选择可按照自己来选,安装步骤大同小异,基本一样 fedora 使用的是官网提供的工具制作的镜像(推荐) – ...

  4. gorm软删除_Gorm.Model.DeletedAt 变量类型分析

    以下介绍基于 Golang 语言的操作 Gorm 介绍 Gorm 是处理 Mysql 的一个工具.默认使用 struct `Name` 对应的 `Name`s 作为表名,同时 struct 参数名,作 ...

  5. php软删除代码,PHP laeavel软删除以及软删除还原 易错点

    PHP laeavel软删除以及软删除还原 易错点 PHP laeavel软删除以及软删除还原 易错点 首先 数据库字段添加deleted_at字段 然后在模型层中引入 SoftDeletes类 并引 ...

  6. Ctrl+shift+k会调出搜狗输入法软键盘,与VSCode行删除快捷键冲突

    Ctrl+shift+k会调出搜狗输入法软键盘,与VSCode行删除快捷键冲突 解决 1.在搜狗输入法图标任意位置,右键 2.点击属性设置 3.点击高级–>系统功能快捷键 4.取消软键盘快捷键的 ...

  7. 批量删除EXCEL里的软回车

    批量删除EXCEL里的软回车 目的:查找excel单元格中的换行符(alt + enter),并且把它代替为空. 通过在查找框内(通过按ctrl + f调出),在[替换内容]内输入: 第1种方法:按住 ...

  8. 2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

    本文始发于个人公众号[两猿社]. 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验. 他来了,他来了,他带着面试绿卡走来了. 他来了,他来了,他带着20w大奖走来了. 一年一度的华为软 ...

  9. CAD二次开发--三维多段线(Polyline3d)删除再绘制不能同步刷新的问题(格式刷变更实体属性踩坑总结)

    大家是否遇到过这个问题呢?变更一条三维多段线的属性(类似于格式刷),当删除再绘制的时候,会出现明显的卡顿现象,就是命令输入完毕后,必须鼠标再点一下才能成功!很明显这个和"格式刷"那 ...

最新文章

  1. 高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决
  2. dosbox edit.exe 如何使用_如何实现摄影后期无限色彩调色?Infinite Color
  3. Android--WebView显示Html,让其中的图片适应屏幕宽度
  4. TensorRT学习笔记6 - IPlugin
  5. 最小总代价(洛谷-U17433)
  6. char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...
  7. ~~并查集模板(数据结构)(附题目AcWing 836. 合并集合)
  8. 【车牌识别】基于matlab GUI模板匹配车牌识别(带面板)【含Matlab源码 1215期】
  9. 宽带网速如何测试软件,怎么测网速(教你精准测速的方法)
  10. go-cqhttp系列教程-gocqhttp数据处理端-2
  11. 国际知名芯片专家,加盟武昌理工学院人工智能学院
  12. MySQL数据库--韩顺平老师课
  13. 【转】Mac 下钥匙串不能授权访问怎么解决--不错
  14. 稀缺性原则适用于软件产品
  15. Android 应用开发中国大学生挑战赛
  16. voronoi图编程构造_voronoi图的算法编程实现.doc
  17. 基于R语言的随机森林算法运用
  18. Springboot中如何优雅的写好Controller层代码
  19. 多视图点云配准算法综述
  20. 嵌入式软件工程师面试题收录(1)

热门文章

  1. PDO的bindParam与bindValue的区别
  2. JBPM使用assignHandler进行用户分派思路
  3. pgsql 安装详解
  4. Firefox 的一个HTTP分析器扩展
  5. golang goroutine 协程同步 sync.WaitGroup 简介
  6. lua sleep函数实现
  7. 服务发现存储仓库 etcd 使用简介
  8. jenkins rec cve-2019-1003000 复现
  9. goland 关闭 自动移除未使用的包  自动添加需要的包
  10. python3 判断字符串是否包含指定字符