Go语言中使用GORM所需要的注意事项记录
发布于

文章目录 ☰
使用 sql.NullInt64
修改代码,将 Cnt
的类型改为 sql.NullInt64
,并检查其 Valid
字段来判断是否为 NULL
查找被软删除的记录
可以使用 Unscoped
来查询到被软删除的记录
db.Unscoped().Where("age = 20"). Find(&users)
N+1 问题
N+1 问题是什么?
N+1 问题通常出现在关联查询的场景中。例如:
- 查询一个主表记录(1 次查询)
- 对于每条主表记录,再查询其关联的子表记录(N 次查询)
总查询次数为 1+N,这就是 N+1问题。
GORM 的 Preload 如何解决 N+1 问题?
GORM 的 Preload
功能通过批量加载关联数据来避免 N+1 问题。具体实现如下:
- 批量查询主表数据: GORM 会先查询主表的所有记录(1次查询)
- 提取关联键: 从主表记录中提取关联字段(例如外键)
- 批量查询关联数据: 使用 IN 语句一次性查询所有关联的子表数据(1 次查询)
- 将关联数据映射到主表记录: GORM 将查询到的子表数据与主表记录进行匹配,完成关联加载
通过这种方式,GORM 将1+N
次查询优化为2
次查询,显著提升性能。
Preload带条件
users, err := u.WithContext(ctx).Where(u.State.Eq("active")).Preload(u.Orders.On(o.State.NotIn("cancelled")).Find()
版权声明
未经授权,禁止转载本站文章。如需转载必须保留原文链接并注明出处。
只要保留链接并注明出处,即视为默认获得授权。未注明出处或删除链接将视为侵权,必追究法律责任!
本文原文链接:《Go语言中使用GORM所需要的注意事项记录》