发布时间:2026/7/24 10:53:49
gorm.DeletedAt gorm.DeletedAt是 GORM 用于实现软删除的特殊类型基于sql.NullTime或gorm.io/datatypes中的实现。基本特性表格特性说明类型本质sql.NullTime的扩展包含Time time.Time和Valid bool零值Validfalse表示记录未被删除删除时设置当前时间Validtrue查询时GORM 自动过滤Validtrue已删除的记录定义与使用goimport ( gorm.io/gorm time ) type User struct { ID uint gorm:primaryKey Name string CreatedAt time.Time UpdatedAt time.Time DeletedAt gorm.DeletedAt gorm:index // 软删除字段 }基本操作软删除不真正删除数据go// 删除用户设置 deleted_at 为当前时间 db.Delete(user) // SQL: UPDATE users SET deleted_at2026-07-24 08:23:00 WHERE id 1 // 批量软删除 db.Where(age ?, 60).Delete(User{})查询自动排除已删除go// 普通查询自动加 deleted_at IS NULL db.Find(users) // SQL: SELECT * FROM users WHERE deleted_at IS NULL db.First(user, 1) // SQL: SELECT * FROM users WHERE id 1 AND deleted_at IS NULL查询包含已删除的记录go// 使用 Unscoped 绕过软删除过滤 db.Unscoped().Find(users) // 查全部 db.Unscoped().First(user, 1) // 查单条包括已删除 // 只查已删除的 db.Unscoped().Where(deleted_at IS NOT NULL).Find(users)恢复软删除的记录go// 先找到记录包含已删除的 db.Unscoped().First(user, 1) // 恢复将 deleted_at 设为 NULL db.Model(user).Update(deleted_at, nil) // 或 db.Model(user).Update(deleted_at, gorm.DeletedAt{})永久删除go// 必须加 Unscoped否则只是软删除 db.Unscoped().Delete(user) // SQL: DELETE FROM users WHERE id 1与 null.Time 的关系go// gorm.DeletedAt 本质上就是 sql.NullTime 的别名扩展 type DeletedAt sql.NullTime // 所以它有 deletedAt.Time // 删除时间 deletedAt.Valid // true已删除, false未删除自定义软删除字段名gotype User struct { ID uint gorm:primaryKey Name string DeletedAt gorm.DeletedAt gorm:index;column:deleted_time // 自定义列名 }注意事项表格注意点说明必须加gorm:index否则查询性能差因为大部分查询都要过滤deleted_at IS NULL关联查询关联模型也会自动过滤已删除记录唯一索引软删除场景下唯一索引需要包含deleted_at否则删除后无法插入相同数据不兼容db.RowsAffected软删除返回的 RowsAffected 是更新数不是删除数唯一索引处理常见问题go// ❌ 错误这样删除后再插入相同 email 会报唯一冲突 type User struct { ID uint gorm:primaryKey Email string gorm:uniqueIndex DeletedAt gorm.DeletedAt gorm:index } // ✅ 正确唯一索引包含 deleted_at type User struct { ID uint gorm:primaryKey Email string gorm:uniqueIndex:idx_email_deleted DeletedAt gorm.DeletedAt gorm:uniqueIndex:idx_email_deleted }总结表格操作方法软删除db.Delete(user)查未删除db.Find(users)自动过滤查全部db.Unscoped().Find(users)恢复db.Model(user).Update(deleted_at, nil)永久删除db.Unscoped().Delete(user)

相关新闻

2026/7/24 10:48:49

思考极客与黑客精神的融合实践产物

思考极客与黑客精神的融合实践产物——QiLink**以前我给工程师写过一封大厂P7/P8的一封“劝退信”:与其做AI时代的耗材,不如来这里留份“家产”** 2026年了,如果你还在大厂的P序列里卷生卷死,那你可能还没意识到危机的严重性。 今…

2026/7/24 10:48:49

大模型学习路径:从零基础到工业级落地的实战指南

1. 大模型学习路径全景解析2026年的大模型技术发展已经进入深水区,从最初的文本生成到现在的多模态交互,技术栈的复杂度呈指数级增长。作为从业五年的AI工程师,我完整经历了从Transformer架构兴起到大模型工业化落地的全过程。这条学习路径不…

2026/7/24 10:48:49

《技术大败局》新能源汽车篇(更新2)

QiLinkOS报告:行业风险导航系列《技术大败局》新能源汽车篇(2)富比案:国内高科技知识产权第一案起因:400多人集体跳槽2003年起,比亚迪从做电池切入手机代工领域,直接动了富士康的蛋糕。郭台铭后来怒斥:"我们总共被…

2026/7/24 15:14:08

C++ STL容器适配器:queue与stack底层实现与性能优化

1. 项目概述:从“容器适配器”说起 如果你写过C,几乎不可能没用过 std::queue 和 std::stack 。它们太常见了,以至于我们常常把它们和 vector 、 list 这些基础容器混为一谈。但当你打开STL源码,或者面试被问到“queue和s…

2026/7/24 15:14:08

C++后端校招攻略:从简历优化到面试体系化备战

1. 项目概述:一份为C后端校招量身定制的“通关秘籍”又到了一年一度的秋招季,看着身边学弟学妹们为了一份心仪的后端开发Offer,在简历和面试题海里挣扎,我仿佛看到了几年前的自己。那时候,信息远没有现在这么集中&…

2026/7/24 15:14:07

Python毕业设计-基于 Django 的香港历史文化科普网站设计与实现 面向大众的香港历史知识科普 Web 平台设计(源码+LW+部署文档+全bao+远程调试+代码讲解等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/24 15:14:07

千笔与云笔AI:专科生论文写作效率提升方案对比

1. 项目背景与核心价值 2026年对于学术研究者而言是个关键节点,各大高校和研究机构的毕业季、职称评定都集中在这个时间段。在这个时间窗口下,一款真正能提升论文写作效率的AI工具将成为刚需。千笔专业学术智能体和云笔AI正是瞄准了这一细分市场&#xf…

2026/7/24 15:14:07

DeepSeek AI技术架构演进与核心算法解析

1. DeepSeek技术架构的演进轨迹 作为AI领域的技术从业者,我完整经历了DeepSeek从V1到V4的迭代过程。这套系统的技术演进呈现出明显的三阶段特征: 1.1 基础能力建设期(V1-V2) 2019年发布的V1版本采用经典的Transformer架构&#…

2026/7/24 15:09:07

TPS2388八端口PoE+ PSE控制器电路设计与PCB布局实战指南

1. 项目概述与核心价值如果你正在设计一款需要为多个网络摄像头、无线接入点或IP电话集中供电的网络交换机或中跨设备,那么以太网供电(PoE)技术绝对是绕不开的一环。而PoE系统的“大脑”和“心脏”,就是供电设备(PSE&a…

2026/7/23 12:54:51

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/24 0:03:10

不同品牌斜齿行星减速机如何替换?以PX与PAG系列为例

不同品牌斜齿行星减速机如何替换?以 PX 与 PAG 系列为例 一、系列对应不等于型号直接互换 PX 与 PAG 都属于斜齿、方法兰、输出轴式精密行星减速机,结构形式和应用方向具有对应关系。 原设备使用PX系列时,可以优先从PAG系列中寻找替换型号。但…

2026/7/24 0:03:10

jdk8 把list 扁平化成String 多个以逗号分隔

在 JDK 8 中&#xff0c;将 List 扁平化为以逗号分隔的 String&#xff0c;有几种非常简洁且高效的方法。&#x1f680; 推荐方案&#xff1a;使用 Collectors.joining()这是最标准的 Java 8 写法&#xff0c;适用于 List<String>。javaimport java.util.stream.Collecto…

2026/7/24 0:03:10

java 两个 long id 怎么合并成一个long id 并且不重复

“把两个 Long ID 合并成一个唯一的 Long ID&#xff0c;且保证不重复”这个需求&#xff0c;在 Java 里直接做数学上的“完美合并”是不可能的。因为两个 Long&#xff08;各 64 位&#xff09;要合并成一个 Long&#xff08;64 位&#xff09;&#xff0c;在信息论上是有损压…

2026/7/23 23:42:43

3个高效策略:快速掌握Axure中文界面配置

3个高效策略&#xff1a;快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…