我遇到了一个非常大的结果集只返回一行的问题。
Session.query(TestSet).join(Instance).count()
>> 4283878
Session.query(TestSet).join(Instance).offset(0).limit(100).count()
>> 100
Session.query(TestSet).join(Instance).offset(0).limit(100).all()
>> [<model.testset.TestSet object at 0x043EC2F0>]
那是,all
仅返回one我的模型的实例,而不是 100。现在,更奇怪的是:
len(Session.query(TestSet).join(Instance).offset(0).limit(100).distinct().all())
>> 100
所以如果我添加distinct
before all
,我返回所有 100 个结果。这里发生了什么?
The Query
对象,当要求迭代代表实体的结果时,例如TestSet
,根据对象标识对结果行执行唯一化,因此,如果查询返回 100 行,每行具有相同的TestSet
主键,你只能得到一个结果对象。这种行为起源于“渴望加入”功能Query
,通常情况下,会收到许多结果行,每个结果行都具有相同的主要标识,但还包含相关行的不同辅助标识,该相关行将根据每个主要标识填充到集合中 - 只有主要标识的一个实例在这种非常常见的情况下是可取的。
然后我们考虑一下什么distinct()
做。假设您对 4M 对象的查询返回 id=1 的 1000 行、id=2 的 1000 行等。带有 limit(100) 的查询命中 id=1 的前 100 行,Query
唯一化,你会得到一个结果对象,因为它们都是 id=1。但与distinct()
,突然我们得到了 100 行具有不同身份的行,即“id=1”、“id=2”、“id=3”。Query
然后将每一行分配给一个新的TestSet
对象在恒等映射中,你会得到 100 行。
Setting echo='debug'
在你的Engine
暂时将显示正在发出的 SQL 以及返回的结果行。当您看到许多结果行都具有相同的主键时,您就知道Query
当要求返回完整实体时,会将所有这些冗余身份唯一化为每行表示的单个对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)