全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 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

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

A

B

2

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

A

B

单选题
3

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

A

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

B

使用 db.PoolStats() 方法

C

查询数据库系统表

D

查看 GORM 日志输出

4

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

A

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

B

使用 db.PoolStats() 方法

C

查询数据库系统表

D

查看 GORM 日志输出

5

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

A

Delete() 方法

B

Unscoped().Delete() 方法

C

HardDelete() 方法

D

ForceDelete() 方法

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 标准库实现的?

A

database/sql 库

B

net/http 库

C

sync.Pool 库

D

container/list 库

9

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

A

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

B

使用 db.Restore() 方法

C

使用 db.Undelete() 方法

D

软删除的记录无法恢复

10

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

A

db.Delete()

B

db.Unscoped().Delete()

C

db.HardDelete()

D

db.ForceDelete()

11

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

A

time.Time

B

*time.Time

C

gorm.DeletedAt

D

int64

12

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

A

db.Delete()

B

db.Unscoped().Delete()

C

db.HardDelete()

D

db.ForceDelete()

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

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

A

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

B

使用 db.Restore() 方法

C

使用 db.Undelete() 方法

D

软删除的记录无法恢复

15

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

A

db.Delete(&user)

B

db.Unscoped().Delete(&user)

C

db.HardDelete(&user)

D

db.PermanentDelete(&user)

多选题
16

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

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)

参考答案
1.正确 2.正确 3.A 4.A 5.B 6.A 7.A 8.A 9.A 10.B 11.C 12.B 13.B 14.A 15.B 16.A;C
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一个专题 生态与工具链专题
下一个专题 → 钩子函数与回调机制专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码