Golang Gorm 一对多查询 preload预加载

news/2024/6/16 22:23:59 标签: golang

预加载示例


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

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
	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就提前把这张表全部取出来,然后再执行FirstFind这样的方法去查询主数据,最后把两种数据一一对应起来。

	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}]}

http://www.niftyadmin.cn/n/4973510.html

相关文章

报错处理:Docker容器无法启动

具体报错: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"program\": executable file not found in $PATH": unknown. 报错环境: 该报错出现在使用…

Leetcode-每日一题【剑指 Offer 36. 二叉搜索树与双向链表】

题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。 为了让您更好地理解问题,以下面的二叉搜索树为例: 我们希望将这个二叉搜索树转化为双向循环链表…

2.Redis 通用命令

Redis 中最核心的两个命令: set 作用:设置 key 对应的 value 值并存储进去。若key已包含一个值,则无论其类型如何,都会覆盖该值。在SET操作成功时,将丢弃与密钥相关联的任何先前生存时间。 对于上述这里的 key和val…

必抓!程序员必备的关键算法:探索编程世界的珍宝

嗨,亲爱的编程同道们!在这个码农的世界里,算法就像我们的剑与盾,为我们打开问题的大门。不论你是新手刚踏入编程领域,还是老手早已颇有心得,总有那几种算法是我们绝对不能错过的,它们是你编程路…

lintcode 3677 · 设计文件系统预发 【算法,系统设计题 中等】

题目链接,描述 https://www.lintcode.com/problem/3677 在本题中,你需要设计一个文件系统,该文件系统能够创建新路径并绑定一个值。其中每个路径均以分隔符 / 开始,每个分隔符后必须存在若干小写字母。例如,/lint 和…

【力扣每日一题】2023.8.27 合并区间

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 那么合并区间是在什么情况下才能合并呢? 我总结为两种情况 第一种情况就是这样,第二个区间的左区间大于第一个区…

【element-ui】el-dialog改变宽度

dialog默认宽度为父元素的50%,这就导致在移动端会非常的窄,如图1,需要限定宽度。 解决方法:添加custom-class属性,然后在style中编写样式,注意,如果有scoped限定,需要加::v-deep &l…

增加 alibaba 的 DataX 对 PG数据库 支持 数组类型同步

问题: 用 datax 同步表,有字段是 数组类型的会报下面错误 com.alibaba.datax.common.exception.DataXException: Code:[DBUtilErrorCode-12], Description:[不支持的数据库类型. 请注意查看 DataX 已经支持的数据库类型以及数据库版本.]. - 您的配置文件中的列配置信息有误.…