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}]}
相关推荐
cui_win8 小时前
【基础】Golang语言开发环境搭建(Linux主机)
linux·golang·运维开发
叹一曲当时只道是寻常10 小时前
Softhub软件下载站实战开发(十):实现图片视频上传下载接口
golang·go·音视频
qq_1682789517 小时前
Protobuf在游戏开发中的应用:TypeScript + Golang 实践
服务器·golang·游戏引擎
大模型铲屎官10 天前
【Go语言-Day 7】循环控制全解析:从 for 基础到 for-range 遍历与高级控制
开发语言·人工智能·后端·golang·大模型·go语言·循环控制
mxpan11 天前
深入探究 Go 语言中使用 SQLite 数据库
数据库·golang·sqlite
唯独不开心11 天前
GO 语言学习 之 helloWorld
学习·golang
Go Dgg11 天前
Go 语言的堆糖图片爬虫
开发语言·爬虫·golang
{⌐■_■}11 天前
【编程语言】javascript、java、go对比应用场景
java·javascript·golang
IT艺术家-rookie11 天前
golang--数据类型与存储
开发语言·后端·golang
小诸葛的博客12 天前
go语言实现进度条
开发语言·后端·golang