码造社 | mazaoshe

码造社 | mazaoshe

首页 / 技术与开发 / Go语言中使用GORM所需要的注意事项记录

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

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

使用 sql.NullInt64

修改代码,将 Cnt 的类型改为 sql.NullInt64 ,并检查其 Valid 字段来判断是否为 NULL

gorm-usage-notes

查找被软删除的记录

可以使用 Unscoped 来查询到被软删除的记录

db.Unscoped().Where("age = 20"). Find(&users)

N+1 问题

N+1 问题是什么?

N+1 问题通常出现在关联查询的场景中。例如:

  1. 查询一个主表记录(1 次查询)
  2. 对于每条主表记录,再查询其关联的子表记录(N 次查询)

总查询次数为 1+N,这就是 N+1问题。

GORM 的 Preload 如何解决 N+1 问题?

GORM 的 Preload 功能通过批量加载关联数据来避免 N+1 问题。具体实现如下:

  1. 批量查询主表数据: GORM 会先查询主表的所有记录(1次查询)
  2. 提取关联键: 从主表记录中提取关联字段(例如外键)
  3. 批量查询关联数据: 使用 IN 语句一次性查询所有关联的子表数据(1 次查询)
  4. 将关联数据映射到主表记录: 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所需要的注意事项记录》