GORM v2 关联预加载Preload和Joins的区别

简介: GORM v2 关联预加载Preload和Joins的区别

前言


本文中使用到的数据表结构以及GORM版本的区分详见以下文章:GORM v2 一对一关联查询使用(Belongs To 、Has One)

执行区别


调用gorm的Debug方法打印一下一对一关联时SQL语句执行过程。

Preload执行过程


执行代码


db.Debug().Preload("Info").First(&student)

执行结果


从图中可以看出,gorm执行了两条SQL来获取主副表数据

image.png

SELECT * FROM `students` ORDER BY `students`.`id` LIMIT 1
SELECT * FROM `information` WHERE `information`.`student_id` = 1

Joins执行过程


执行代码


db.Debug().Joins("Info").First(&student)

执行结果


从图中可以看出,使用Joins后,只执行一条SQL语句就获得了结果

image.png

SELECT `students`.`id`,`students`.`name`,`Info`.`id` AS `Info__id`,`Info`.`student_id` AS `Info__student_id`,`Info`.`sex` AS `Info__sex`,`Info`.`age` AS `Info__age`,`Info`.`hometown` AS `Info__hometown` FROM `students` LEFT JOIN `information` `Info` ON `students`.`id` = `Info`.`student_id` WHERE `students`.`id` = 1 ORDER BY `students`.`id` LIMIT 1

结果


两种预加载的差别:

  • Preload会分开多条SQL语句来执行获取结果
  • Joins会使用left join一条SQL语句直接获取到结果
  • 另外,需要注意的是:Joins只能用于一对一关联中,即HasOne和BelongTo关联
目录
相关文章
|
6月前
gorm 一对多关系 以及预加载的用法
gorm 一对多关系 以及预加载的用法
114 0
|
定位技术 API
百度地图开发:阻塞加载慢A parser-blocking, cross site的解决方案
百度地图开发:阻塞加载慢A parser-blocking, cross site的解决方案
490 0
tp框架使用join没法使用field,where问题
tp框架使用join没法使用field,where问题
143 0
【TP5】一个表里边有多个关联怎么使用预加载
【TP5】一个表里边有多个关联怎么使用预加载
94 0
【TP5】一个表里边有多个关联怎么使用预加载
|
SQL 关系型数据库 PostgreSQL
PostgreSQL 统计信息混淆之处(scan,read,fetch,hit)源码解读
PostgreSQL 几个统计信息的解释难以理解,所以本文花一些时间从源码的角度来解释一下。 让大家对这几个容易误解的统计值有更好的理解。 比较难理解的几个统计值为: pg_stat_all_indexes 的 ``` idx_scan idx_tup_read idx_tup_fetch ``` pg_statio_all_indexes 的 ``` idx_blks_read idx_blks_hit ``` pg_stat_all_tables 的 ``` seq_scan seq_tup_read idx_
4438 0
|
关系型数据库 PostgreSQL 索引
PostgreSQL cheat functions - (内存上下文\planner内容\memory context等常用函数)
标签 PostgreSQL , memory context , plan , pid signal , ... 背景 https://github.com/MasaoFujii/pg_cheat_funcs Fujii Masao MasaoFujii PostgreSQL comm...
1297 0