添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
+关注继续查看

前言


本文中使用到的数据表结构以及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关联
追根问底:Objective-C关联属性原理分析
Objective-C是一种动态性很强的语言,所谓动态能力,也可以理解为运行时能力。对于Objective-C开发者来说,动态性所带来的编程便利无处不在。例如通过Category类别来扩展已有类的功能。可以使已有类拥有新的方法和属性。
PostgreSQL , session_preload_libraries , psql: FATAL: could not access file "pg_pathman": No such file or directory 由于粗心,设错了session_preload_l...