难以理解SQLAlchemy

时间:2015-07-02 23:53:02

标签: python postgresql sqlalchemy

在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?

1 个答案:

答案 0 :(得分:0)

由reddit的raylu提供:

a)是的。

b)是的。我不确定为什么INNER JOIN会更有效率。也许效率增益仅适用于已经在会话中加载了许多连接对象的情况。在这种情况下,LEFT OUTER JOIN必须执行相同数量的加载。也许“目标引用”指的是关系“一”侧的东西,并且在LEFT OUTER JOIN中加载无用的NULL行是效率低下的。

c)“连接加载要求外键为NOT NULL [使用INNER JOIN]。”