全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 16 道配套习题

软删除机制专题

专题说明

本专题深入讲解 GORM 软删除机制,包括 gorm.DeletedAt 字段配置、软删除与硬删除的切换、Unscoped 查询已删除记录、恢复软删除数据,以及软删除在关联查询和唯一约束中的行为,确保数据可追溯与安全恢复。

学习目标

  1. 掌握软删除的配置方式和底层 SQL 行为
  2. 学会使用 Unscoped 查询和恢复已删除记录
  3. 理解软删除与硬删除的切换场景
  4. 掌握软删除在关联查询和唯一约束中的影响

学习内容

本专题涵盖以下知识点:

  • gorm.DeletedAt 字段与自动迁移
  • 软删除的底层 SQL 转换
  • Unscoped 查询已删除数据
  • 恢复(Restore)软删除记录
  • 软删除与唯一索引的冲突处理
  • 级联软删除

学习建议

  1. 软删除会在所有查询中自动追加 WHERE deleted_at IS NULL 条件
  2. 唯一索引需考虑软删除记录的冲突问题
  3. 恢复数据时注意关联记录的状态一致性

📝 发现内容有误?点击此处直接编辑

📝 配套习题(16 题)

1
单选题

在 GORM 中恢复一条软删除的记录,正确的做法是?

A

使用 Unscoped 找到记录后,将 DeletedAt 设置为 nil 并 Save

B

使用 db.Restore() 方法

C

使用 db.Undelete() 方法

D

软删除的记录无法恢复

2
多选题

在 GORM 中恢复一条软删除的记录,正确的做法是?

A

使用 Unscoped 找到记录后,将 DeletedAt 设置为 nil 并 Save

B

使用 db.Restore() 方法

C

使用 db.Undelete() 方法

D

软删除的记录无法恢复

3
单选题

在 GORM 中对软删除的模型执行真正的物理删除,应该使用什么方法?

A

db.Delete()

B

db.Unscoped().Delete()

C

db.HardDelete()

D

db.ForceDelete()

4
多选题

在 GORM 中对软删除的模型执行真正的物理删除,应该使用什么方法?

A

db.Delete()

B

db.Unscoped().Delete()

C

db.HardDelete()

D

db.ForceDelete()

5
判断题

在 GORM 中对软删除的模型执行真正的物理删除,应该使用什么方法?

A

B

6
单选题

GORM 的底层连接池是基于哪个 Go 标准库实现的?

A

database/sql

B

net/http

C

sync.Pool

D

container/list

7
多选题

GORM 的底层连接池是基于哪个 Go 标准库实现的?

A

database/sql

B

net/http

C

sync.Pool

D

container/list

8
填空题

GORM 的底层连接池是基于哪个 Go 标准库实现的?

9
单选题

如何监控 GORM 连接池的状态(如空闲连接数、活跃连接数)?

A

使用 db.Stats() 方法获取 sql.DBStats

B

使用 db.PoolStats() 方法

C

查询数据库系统表

D

查看 GORM 日志输出

10
多选题

如何监控 GORM 连接池的状态(如空闲连接数、活跃连接数)?

A

使用 db.Stats() 方法获取 sql.DBStats

B

使用 db.PoolStats() 方法

C

查询数据库系统表

D

查看 GORM 日志输出

11
单选题

实现软删除应该使用什么字段类型?

A

time.Time

B

*time.Time

C

gorm.DeletedAt

D

int64

12
判断题

包含 DeletedAt 字段的模型,查询时 GORM 会自动添加 WHERE deleted_at IS NULL 条件。

A

B

13
单选题

如何查询包含已删除记录的所有数据?

A

db.Find(&users)

B

db.Unscoped().Find(&users)

C

db.IncludeDeleted().Find(&users)

D

db.Where("deleted_at IS NOT NULL").Find(&users)

14
多选题

以下哪些查询会包含已删除的记录?

A

db.Unscoped().Where("name = ?", "A").Find(&users)

B

db.Where("name = ?", "A").Find(&users)

C

db.Unscoped().First(&user, 1)

D

db.Select([]string{"name", "id"}).Find(&users)

15
单选题

如何执行真正的物理删除(硬删除)?

A

db.Delete(&user)

B

db.Unscoped().Delete(&user)

C

db.HardDelete(&user)

D

db.PermanentDelete(&user)

16
判断题

db.Unscoped().Where("status = ?", 0).Delete(&User{}) 会物理删除所有匹配记录。

A

B

← 上一个专题 生态与工具链专题
下一个专题 → 钩子函数与回调机制专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库