gorm软删除_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软删除_gorm踩坑:软删除与某个字段的唯一性相关推荐
- ant design pro入门踩坑:删除页面文件报错
前提:用ant design pro新增注册页,没有显示在菜单,在项目Page文件夹删除 原因:配置路由没有删 总结: 手动删除页面需要删1.Page目录下的页面文件 2.src/Page/.umi/ ...
- vue项目回车删除数据(踩坑记录)
今天改bug的时候,产品说删除数据需要点击回车(enter)键进行删除 于是我先在组件中注入了监听键盘按键的事件 created() {//监听键盘按下事件window.addEventListene ...
- 电脑如何安装双系统 Windows10 和fedora+成功安装+踩坑记-删除EFI文件
– 安装介绍 博主采用的是Windows10 + fedora (linux) 模式 对于系统选择可按照自己来选,安装步骤大同小异,基本一样 fedora 使用的是官网提供的工具制作的镜像(推荐) – ...
- gorm软删除_Gorm.Model.DeletedAt 变量类型分析
以下介绍基于 Golang 语言的操作 Gorm 介绍 Gorm 是处理 Mysql 的一个工具.默认使用 struct `Name` 对应的 `Name`s 作为表名,同时 struct 参数名,作 ...
- php软删除代码,PHP laeavel软删除以及软删除还原 易错点
PHP laeavel软删除以及软删除还原 易错点 PHP laeavel软删除以及软删除还原 易错点 首先 数据库字段添加deleted_at字段 然后在模型层中引入 SoftDeletes类 并引 ...
- Ctrl+shift+k会调出搜狗输入法软键盘,与VSCode行删除快捷键冲突
Ctrl+shift+k会调出搜狗输入法软键盘,与VSCode行删除快捷键冲突 解决 1.在搜狗输入法图标任意位置,右键 2.点击属性设置 3.点击高级–>系统功能快捷键 4.取消软键盘快捷键的 ...
- 批量删除EXCEL里的软回车
批量删除EXCEL里的软回车 目的:查找excel单元格中的换行符(alt + enter),并且把它代替为空. 通过在查找框内(通过按ctrl + f调出),在[替换内容]内输入: 第1种方法:按住 ...
- 2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)
本文始发于个人公众号[两猿社]. 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验. 他来了,他来了,他带着面试绿卡走来了. 他来了,他来了,他带着20w大奖走来了. 一年一度的华为软 ...
- CAD二次开发--三维多段线(Polyline3d)删除再绘制不能同步刷新的问题(格式刷变更实体属性踩坑总结)
大家是否遇到过这个问题呢?变更一条三维多段线的属性(类似于格式刷),当删除再绘制的时候,会出现明显的卡顿现象,就是命令输入完毕后,必须鼠标再点一下才能成功!很明显这个和"格式刷"那 ...
最新文章
- 高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决
- dosbox edit.exe 如何使用_如何实现摄影后期无限色彩调色?Infinite Color
- Android--WebView显示Html,让其中的图片适应屏幕宽度
- TensorRT学习笔记6 - IPlugin
- 最小总代价(洛谷-U17433)
- char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...
- ~~并查集模板(数据结构)(附题目AcWing 836. 合并集合)
- 【车牌识别】基于matlab GUI模板匹配车牌识别(带面板)【含Matlab源码 1215期】
- 宽带网速如何测试软件,怎么测网速(教你精准测速的方法)
- go-cqhttp系列教程-gocqhttp数据处理端-2
- 国际知名芯片专家,加盟武昌理工学院人工智能学院
- MySQL数据库--韩顺平老师课
- 【转】Mac 下钥匙串不能授权访问怎么解决--不错
- 稀缺性原则适用于软件产品
- Android 应用开发中国大学生挑战赛
- voronoi图编程构造_voronoi图的算法编程实现.doc
- 基于R语言的随机森林算法运用
- Springboot中如何优雅的写好Controller层代码
- 多视图点云配准算法综述
- 嵌入式软件工程师面试题收录(1)