在reddit上发布此内容,虽然它可能更像是Stack Overflow问题,因为我正在寻找示例。
我正在努力获得对SQLAlchemy的良好/更高级的掌握,而且我真的很挣扎于eager / join加载,select加载和子查询加载的概念。特别是何时使用。 我总是试图学习并应用“以尽可能最完整的方式向数据库询问您需要什么,以避免过度延迟”的咒语,'这就是我觉得这个主题很重要的原因。迈克拜尔,祝福他,在
部分给出了解释使用内容的镜头http://docs.sqlalchemy.org/en/latest/orm/loading_relationships.html#what-kind-of-loading-to-use
但是我发现用更加简单的英语来理解它是非常困难的。办法。在他谈论或介绍该主题的视频中,他似乎主张使用大量加入的热切加载。我还阅读了关于热切载入的禅的部分;我理解加载策略可以是流动的,并且随着您使用任何数据集进行更改,查询结果不会发生变化。
具体到上面的文档,我对One to Many加入/子查询部分以及Many to One连接的后半部分感到困惑。是否有更容易理解的例子或代码,你们知道这将有助于我更好地理解使用什么策略,什么时候?
编辑:问题仍然有点模糊,我把它缩小到这些:
a)&#34;但是,获取的总行数将等于所有集合的大小总和,以及每个具有空集合的父对象的一个额外行。&#34; < / p>
这是左外连接给出空白列的结果,对吗?在子查询加载中,由于内连接,因为它匹配双方而不会发生?
b)&#34;如果你知道每个父母肯定有一个孩子(即外键引用是非NULL),可以配置连接加载,并将innerjoin设置为True,这通常在关系中指定( )。对于有许多可能尚未加载的目标引用的对象的加载,使用INNER JOIN加入加载非常有效。&#34;
意味着在它们总是匹配的情况下使用innerjoin,否则只是让左外连接做它的工作并返回100个对象?
c)&#34;除了子查询加载在所有情况下都可以使用INNER JOIN,而联合加载要求外键是非NULL。&#34;
可能是最让我感到困惑的那个,上一段没有说加入加载是通过返回所有100行而不管外键吗?为什么不是NULL?
答案 0 :(得分:0)
由reddit的raylu提供:
a)是的。
b)是的。我不确定为什么INNER JOIN会更有效率。也许效率增益仅适用于已经在会话中加载了许多连接对象的情况。在这种情况下,LEFT OUTER JOIN必须执行相同数量的加载。也许“目标引用”指的是关系“一”侧的东西,并且在LEFT OUTER JOIN中加载无用的NULL行是效率低下的。
c)“连接加载要求外键为NOT NULL [使用INNER JOIN]。”