全部学科
Python全栈
python
NodeJS全栈
nodejs

关联关系管理专题测试

20 题 40 分钟 难度:★★

考察知识点

  • HasOne/BelongsTo 一对一关联
  • HasMany 一对多关联
  • Many2Many 多对多关联
  • Preload 预加载与级联操作
💡 参考答案在文末
判断题
1

GORM 的 Joins 方法使用 LEFT JOIN 一次性查询关联数据,比 Preload 更高效。

A

B

2

在 GORM 中查询一对多关系时,默认会自动加载关联的子记录。

A

B

3

当预加载一对多关系的数据量很大时,可以使用 Preload 的 Limit 方法限制加载数量。

A

B

单选题
4

User hasOne Profile 关系中,外键默认在哪个表中?

A

users 表

B

profiles 表

C

中间表

D

两个表都有

5

在 GORM 中,如何配置多对多关系?

A

使用 hasMany tag

B

使用 many2many tag 指定中间表名

C

使用 belongsToMany tag

D

使用 joinTable tag

6

在 GORM 中,如何配置一对多关系?

A

使用 hasMany tag

B

在"一"方定义切片类型的字段

C

在"多"方定义切片类型的字段

D

使用 oneToMany tag

7

GORM 中 hasOne 和 belongsTo 的主要区别是什么?

A

hasOne 在拥有外键的表中配置,belongsTo 在被引用表中配置

B

hasOne 在被引用表中配置,belongsTo 在拥有外键的表中配置

C

hasOne 用于一对一,belongsTo 用于一对多

D

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

8

使用 Joins 查询用户及其订单,正确的写法是?

A

db.Joins("Orders").Find(&users)

B

db.Joins("JOIN orders ON orders.user_id = users.id").Find(&users)

C

db.Join("orders").Find(&users)

D

db.InnerJoin("orders").Find(&users)

9

在 GORM 中,如何预加载用户的订单数据?

A

db.Preload("Orders").Find(&users)

B

db.Load("Orders").Find(&users)

C

db.Include("Orders").Find(&users)

D

db.With("Orders").Find(&users)

10

如何为 Preload 自定义查询条件?

A

db.Preload("Orders", func(db *gorm.DB) *gorm.DB { return db.Where("amount > ?", 100) }).Find(&users)

B

db.Preload("Orders").Where("amount > ?", 100).Find(&users)

C

db.Preload("Orders").Query("amount > ?", 100).Find(&users)

D

db.Preload("Orders", "amount > ?", 100).Find(&users)

多选题
11

以下关于 GORM 预加载 N+1 问题的描述,哪些是正确的?

A

Preload 通过两条 SQL 解决 N+1 问题(先查主表,再 IN 查关联表)

B

Joins 通过一条 JOIN SQL 解决 N+1 问题

C

不使用 Preload 或 Joins,循环中查询关联会产生 N+1 问题

D

GORM 的 AutoPreload 插件可以自动预加载所有关联

12

以下关于 GORM Preload 条件过滤的描述,哪些是正确的?

A

db.Preload("Orders", "state = ?", "paid").Find(&users) 可以过滤订单

B

Preload 的条件只影响关联数据的查询,不影响主查询

C

db.Preload("Orders").Where("state = ?", "paid").Find(&users) 会同时过滤用户和订单

D

可以在 Preload 中使用 Order 和 Limit

13

以下哪些方法可以处理预加载关联不存在的情况?

A

Preload 默认不会报错,关联字段会是空切片或 nil

B

使用 Preload 的 error handler 处理未找到关联的错误

C

使用 Session 配置预加载失败时的行为

D

在 Preload 后检查关联字段是否为空

14

以下哪些是 GORM 一对一关系的正确配置方式?

A

使用 hasOne tag 在主表中配置

B

使用 belongsTo tag 在从表中配置

C

外键默认在主表 ID 字段

D

可以使用 foreignKey tag 自定义外键

15

GORM 自动创建的多对多中间表包含哪些字段?

A

两个外键(分别指向两个表的主键)

B

中间表的主键

C

额外的自定义字段

D

两个表的时间戳

16

以下关于 GORM 一对多关系外键配置的描述,哪些是正确的?

A

默认使用"父级名+ID"作为外键(如 UserID)

B

可以使用 foreignKey tag 自定义外键

C

外键必须手动在数据库中创建

D

AutoMigrate 会自动创建外键约束

17

以下关于 belongsTo 的描述哪些是正确的?

A

belongsTo 在拥有外键的模型中配置

B

belongsTo 表示"属于"另一个模型

C

外键可以在 belongsTo 中自定义

D

belongsTo 和 hasOne 可以互换使用

填空题
18

预加载用户的订单以及订单的商品,可以使用 db.Preload("Orders").Preload("____________").Find(&users)db.Preload("Orders.Items").Find(&____________)

19

如果需要在多对多关系的中间表中添加额外字段(如创建时间),可以定义____________并使用 gorm:"many2many:中间表名;foreignKey:____________" 配置。

20

查询用户及其订单数量,可以使用 db.Preload("Orders").____________("users.*, (SELECT count(*) FROM orders WHERE orders.user_id = users.id) as order_count").____________(&users)

参考答案
1.正确 2.错误 3.错误 4.B 5.B 6.B 7.B 8.B 9.A 10.A 11.A;B;C 12.A;B 13.A;B;D 14.A;B;D 15.A;B 16.A;B;D 17.A;B;C 18.Orders.Items;users 19.独立的中间表模型;外键1;joinForeignKey:连接外键 20.Select;Find
想在手机上练习这套试卷?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码
← 上一套试卷 事务处理专题测试
下一套试卷 → 分库分表与多租户专题测试
扫码体验小程序
加载中
想在手机上刷题学习?
使用微信卷王开发者小程序,打开首页顶部扫码功能识别二维码