Golang Gorm 一对多查询 preload预加载

预加载示例


GORM允许使用 Preload通过多个SQL中来直接加载关系, 例如:

Go 复制代码
type User struct {
  gorm.Model
  Username string
  Orders   []Order
}

type Order struct {
  gorm.Model
  UserID uint
  Price  float64
}

// 查找 user 时预加载相关 Order
db.Preload("Orders").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4);

db.Preload("Orders").Preload("Profile").Preload("Role").Find(&users)
// SELECT * FROM users;
// SELECT * FROM orders WHERE user_id IN (1,2,3,4); // has many
// SELECT * FROM profiles WHERE user_id IN (1,2,3,4); // has one
// SELECT * FROM roles WHERE id IN (4,5,6); // belongs to
Go 复制代码
	var u []User
	db.Debug().Preload("Articles").Find(&u)
	fmt.Println(u)

[1.486ms] [rows:7] SELECT * FROM `article` WHERE `article`.`user_id` IN (1,2,3)

[2.644ms] [rows:3] SELECT * FROM `user`
[{1 lucas [{1 golang 1} {2 k8s 1}]} {2 yanzi [{3 golang 2} {4 k8s 2}]} {3 test [{5 redis 3} {6 cherry 3} {7 marry 3}]}]

preload的原理


其实很简单,你要preload user表 的数据,gorm就提前把这张表全部取出来,然后再执行First或Find这样的方法去查询主数据,最后把两种数据一一对应起来。

Go 复制代码
	var u User
	db.Debug().Preload("Articles").Take(&u, "name = ?", "test")
	fmt.Println(u)


[2.007ms] [rows:3] SELECT * FROM `article` WHERE `article`.`user_id` = 3

[3.056ms] [rows:1] SELECT * FROM `user` WHERE name = 'test' LIMIT 1
{3 test [{5 redis 3} {6 cherry 3} {7 marry 3}]}
相关推荐
海奥华230 分钟前
分库分表技术详解:从入门到实践
数据库·后端·mysql·golang
智商低情商凑12 小时前
Go学习之 - Goroutines和channels
开发语言·学习·golang
半桶水专家12 小时前
Go 语言时间处理(time 包)详解
开发语言·后端·golang
编程点滴12 小时前
Go 重试机制终极指南:基于 go-retry 打造可靠容错系统
开发语言·后端·golang
月屯16 小时前
后端go完成文档分享链接功能
开发语言·后端·golang
喵了几个咪18 小时前
Golang微服务框架Kratos实现Thrift服务
开发语言·微服务·golang
Zzz 小生1 天前
Github-Go语言AI智能体开发套件:构建下一代智能代理的利器
人工智能·golang·github
Tony Bai2 天前
Go 在 Web3 的统治力:2025 年架构与生态综述
开发语言·后端·架构·golang·web3
q***06292 天前
搭建Golang gRPC环境:protoc、protoc-gen-go 和 protoc-gen-go-grpc 工具安装教程
开发语言·后端·golang
Wenhao.2 天前
LeetCode Hot100 每日温度
数据结构·算法·leetcode·golang