全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 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
单选题

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

A

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

B

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

C

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

D

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

2
多选题

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

A

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

B

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

C

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

D

db.Update(&user) 直接更新

3
判断题

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

A

B

4
单选题

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

A

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

B

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

C

不执行删除,返回错误

D

将记录标记为无效状态

5
多选题

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

A

db.Unscoped().Delete(&user)

B

db.Delete(&user, id)

C

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

D

db.HardDelete(&user)

6
判断题

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

A

B

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
多选题

以下哪些是 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")

9
填空题

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

10
单选题

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

A

保持原值不变

B

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

C

被设置为 0

D

返回错误

11
多选题

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

A

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

B

db.CreateInBatches(users, 100)

C

循环调用 db.Create(&u)

D

db.BulkCreate(users)

12
单选题

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

A

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

B

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

C

两者完全相同

D

Take 只能用于软删除模型

13
判断题

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

A

B

14
多选题

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

A

db.Delete(&user, 1)

B

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

C

db.Delete(User{}, 1)

D

(&user).Delete()

15
单选题

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

语法错误

16
多选题

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

17
单选题

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

A

nil

B

gorm.ErrRecordNotFound

C

空结构体

D

panic

18
判断题

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

A

B

下一个专题 → GORM 基础概念专题

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

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

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

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