全部学科
Python全栈
python
NodeJS全栈
nodejs
📝 1 篇文章 18 道配套习题

CRUD 基础操作专题

专题说明

本专题聚焦于 GORM 的 CRUD(创建、读取、更新、删除)基础操作。通过 18 道精选题目,系统讲解创建与批量创建、查询方法差异(First/Take/Find)、记录更新方式(Update/Updates/Save)、软删除与硬删除机制、查询条件构建方法等核心知识点。帮助读者掌握 GORM 日常数据操作的完整能力。

学习目标

  1. 掌握 Create 单条与批量创建,理解创建后 ID 自动回填机制
  2. 区分 First、Take、Find 三种查询方法的使用场景和差异
  3. 理解 Update、Updates、Save 三种更新方式的区别和零值保护机制
  4. 掌握软删除的实现原理、Unscoped 硬删除及 Delete 多种调用方式
  5. 熟练使用 Where、Or、Not、Map 等方法构建查询条件,避免 SQL 注入

学习内容

本专题涵盖以下知识点:

  • 创建记录:Create 单条创建、批量创建、创建后 ID 回填
  • 查询基础:First/Take/Find 的区别、未找到记录的错误处理
  • 更新记录:Update 单字段更新、Updates 多字段更新与零值保护、Save 全量保存
  • 删除记录:软删除原理、Unscoped 硬删除、RowsAffected 返回值、Delete 多种参数形式
  • 查询条件构建:Where 参数化查询、多条件组合(Or/Not)、Map 条件查询

学习建议

  1. 重点理解 Updates 方法对结构体零值的保护机制,需要使用 map 才能更新零值
  2. 软删除是 GORM 的重要特性,理解 DeletedAt 字段如何影响查询和删除行为
  3. 查询条件构建时始终使用参数化查询,避免 SQL 注入风险

📝 配套习题(18 题)

💡 参考答案在文末
判断题
1

db.Find(&users) 不加任何条件会查询表中的所有记录。

A

B

2

db.Save(&user) 会更新结构体中的所有字段,包括零值字段。

A

B

3

使用 Updates 方法传入结构体时,零值字段(如 0、空字符串)不会被更新到数据库。

A

B

4

使用 Delete 方法删除记录后,可以通过 result.RowsAffected 获取删除的记录数。

A

B

单选题
5

GORM 默认对包含 DeletedAt 字段的模型执行什么类型的删除?

A

硬删除,直接从数据库删除

B

软删除,将 DeletedAt 设置为当前时间

C

不执行删除,返回错误

D

将记录标记为无效状态

6

GORM 的 Update 方法和 Updates 方法的主要区别是什么?

A

Update 更新单字段,Updates 更新多字段

B

Update 需要指定列名,Updates 从结构体提取

C

Update 用于单条记录,Updates 用于批量更新

D

两者完全相同,只是命名不同

7

以下哪个是正确的 GORM Where 查询方式?

A

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

B

db.Where("name", "张三").Find(&users)

C

db.Where(name = "张三").Find(&users)

D

db.Where("name = '张三'").Find(&users)

8

db.First(&user) 如果没有找到记录,会返回什么?

A

nil

B

gorm.ErrRecordNotFound

C

空结构体

D

panic

9

db.Where(map[string]interface{}{"name": "A", "age": 18}) 的查询条件是什么?

A

name = "A" AND age = 18

B

name = "A" OR age = 18

C

只查询 name = "A"

D

只查询 age = 18

10

使用 db.Create(&user) 创建记录后,user 对象的 ID 字段会怎样?

A

保持原值不变

B

自动填充数据库返回的主键值

C

被设置为 0

D

返回错误

11

db.Where("name = ?", "A").Or("name = ?", "B").Find(&users) 的 SQL 等价语句是?

A

SELECT * FROM users WHERE name = "A" OR name = "B"

B

SELECT * FROM users WHERE name = "A" AND name = "B"

C

先查询 A 再查询 B

D

语法错误

12

db.First(&user) 和 db.Take(&user) 的主要区别是什么?

A

First 按主键排序取第一条,Take 无排序

B

First 返回错误如果有多条,Take 不返回

C

两者完全相同

D

Take 只能用于软删除模型

多选题
13

在 GORM 中,如何执行真正的物理删除(硬删除)?

A

db.Unscoped().Delete(&user)

B

db.Delete(&user, id)

C

db.Where("id = ?", id).Unscoped().Delete(&User{})

D

db.HardDelete(&user)

14

以下哪些是 GORM Delete 方法的正确调用方式?

A

db.Delete(&user, 1)

B

db.Where("id = ?", 1).Delete(&User{})

C

db.Delete(User{}, 1)

D

(&user).Delete()

15

以下哪些是 GORM 支持的批量创建方式?

A

db.Create([]User{user1, user2})

B

db.CreateInBatches(users, 100)

C

循环调用 db.Create(&u)

D

db.BulkCreate(users)

16

以下哪些是 GORM 支持的查询条件构建方式?

A

db.Where("age > ?", 18).Where("status = ?", 1)

B

db.Where("age > ? AND status = ?", 18, 1)

C

db.Where(map[string]interface{}{"age": 18, "status": 1})

D

db.Where("age > 18").Or("status = 1")

17

以下哪些是 GORM 支持的更新方式?

A

db.Model(&user).Update("name", "新值")

B

db.Model(&user).Updates(User{Name: "新值"})

C

db.Save(&user) 保存整个结构体

D

db.Update(&user) 直接更新

填空题
18

使用____________方法可以构建否定条件,如 db.Not("status = ?", 1) 等价于____________

参考答案
1.正确 2.正确 3.正确 4.正确 5.B 6.B 7.A 8.B 9.A 10.B 11.A 12.A 13.A;C 14.A;B 15.A;B;C 16.A;B;C;D 17.A;B;C 18.Not;status != 1
想在手机上练习这套专题?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
下一个专题 → GORM 基础概念专题
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码