【Go 电商实战 03】如何使用 ORM 链式操作? 如何优雅的实现软删除?
上期回顾
我会把 Go 语言中的知识点结合商业项目,让大家理论联系实践,融会贯通。
上一篇内容分享了【电商实战02】如何借助工具快速生成代码?新手容易踩的这些坑一定要避开。
如果你第一次看我【电商实战】系列的文章,建议先看【电商实战系列】先看这里:适合人群&课程大纲&开源地址&视频合集&一起学习
看过的朋友请忽略,继续往下看:
本期重点
用到的知识点包括:
ORM 链式操作
如何优雅的进行时间维护
软删除和物理删除的区别
如何优雅的实现软删除
结合商业项目需求,有哪些容易踩的坑?
本期内容除了在掘金发布文章,也在 B 站发布了视频版。欢迎大家三连关注一波:# 【B站视频教程-电商实战03】链式操作_软删除_优雅的时间管理_删除轮播图
下面重点介绍一下 ORM 链式操作-时间维护的知识点,看完这部分再看视频效果更好。
ORM 链式操作-时间维护
需要注意,该特性仅对链式操作有效。
gdb
模块支持对数据记录的写入、更新、删除时间自动填充,提高开发维护效率。为了便于时间字段名称、类型的统一维护,如果使用该特性,我们约定:
字段应当设置允许值为
null
。字段的类型必须为时间类型,如:
date
,datetime
,timestamp
。不支持数字类型字段,如int
。字段的名称不支持自定义设置,并且固定名称约定为:
created_at
用于记录创建时更新,仅会写入一次。updated_at
用于记录修改时更新,每次记录变更时更新。deleted_at
用于记录的软删除特性,只有当记录删除时会写入一次。
字段名称其实不区分大小写,也会忽略特殊字符,例如CreatedAt
, UpdatedAt
, DeletedAt
也是支持的。此外,时间字段名称可以通过配置文件进行自定义修改,并可使用TimeMaintainDisabled
配置完整关闭该特性。
对时间类型的固定其实是为了形成一种规范。
特性的启用
当数据表包含created_at
、updated_at
、deleted_at
任意一个或多个字段时,该特性自动启用。
以下的示例中,我们默认示例中的数据表均包含了这 3 个字段。
created_at
写入时间
在执行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore
方法时自动写入该时间,随后保持不变。
需要注意的是Replace
方法也会更新该字段,因为该操作相当于删除已存在的旧数据并重新写一条数据。
updated_at
更新时间
在执行Insert/InsertIgnore/BatchInsert/BatchInsertIgnore
方法时自动写入该时间,在执行Save/Update
时更新该时间(注意当写入数据存在时会更新updated_at
时间,不会更新created_at
时间)。
需要注意的是Replace
方法也会更新该字段,因为该操作相当于删除已存在的旧数据并重新写一条数据。
deleted_at
数据软删除
软删除会稍微比较复杂一些,当软删除存在时,所有的查询语句都将会自动加上deleted_at
的条件。
查询的时候会发生一些变化,例如:
可以看到当数据表中存在deleted_at
字段时,所有涉及到该表的查询操作都将自动加上deleted_at IS NULL
的条件
联表查询的场景
如果关联查询的几个表都启用了软删除特性时,会发生以下这种情况,即条件语句中会增加所有相关表的软删除时间判断。
Unscoped
忽略时间特性
Unscoped
用于在链式操作中忽略自动时间更新特性,例如上面的示例,加上Unscoped
方法后:
软删除和物理删除的区别
软删除也叫标记删除,通过字段标记纪录是否被删除:
比如通过 is_delete 字段标记,默认为 0,删除时设置为 1
或者和视频内容一样,使用 deleted_at 字段纪录删除的时间,默认为 null
物理删除,就是直接将 DB 中的记录删掉
如何优雅的实现软删除
如果你详细看完了ORM链式操作-时间维护
这部分内容,想必心中一定有了答案。
结合商业项目需求,有哪些容易踩的坑?
结合实际情况决定使用物理删除还是软删除
比如管理后台删除轮播图这种操作建议使用软删除。因为可能出现误操作的情况,软删除可以及时找回;而且轮播图的数据往往不多,冗余保存也是没有问题的。
再比如用户移除收藏文章的记录,建议物理删除。原因是收藏文章,取消收藏这类操作比较随意,没有任何风险。再者这类数据量比较庞大,软删除没有意义,反而会增加收藏操作的逻辑压力和 DB 压力。
初学 Go 必看
如果你有一定的 GO 基础,相信看完文章之后就懂了,因为并不是很进阶的知识点。
如果你是初学 Go 的小白,建议你观看我在 B 站录制的免费视频: 【Go电商实战03】电商实战_链式操作_软删除_优雅的时间管理_删除轮播图 ,让你少踩坑,高效学。
一起学习
欢迎和我们一起学 Go,坚持打卡,互相监督。
可以在 InfoQ 评论区留言给我。也可以通过下面「作者栏」的信息联系我,一起学习。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/b9a750b84235c07072b82640b】。文章转载请联系作者。
评论 (1 条评论)