Sar*_*els 4 python database select sqlalchemy
我遇到一个非常大的结果集只有返回一行的问题.
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>]
Run Code Online (Sandbox Code Playgroud)
也就是说,all只返回我的模型的一个实例,而不是100.现在,对于更奇怪的东西:
len(Session.query(TestSet).join(Instance).offset(0).limit(100).distinct().all())
>> 100
Run Code Online (Sandbox Code Playgroud)
因此,如果我distinct之前添加all,我会收到所有100个结果.这里发生了什么?
zzz*_*eek 15
的Query对象,当记者问到遍历表示一个实体,类似的结果TestSet,基于对象的身份对结果行执行uniquing,因此,如果查询中来回报每100行具有相同TestSet的主键,你会得到结果只有一个对象背部.这种行为起源于"渴望加入"的特征Query,在这种情况下,通常情况是每个接收到的行都具有相同的主要标识,但也包含要填充到的相关行的不同的次要标识.收集每个主要身份 - 在这种非常常见的情况下,只需要一个主要身份的实例.
让我们考虑一下distinct().假设您对4M对象的查询返回1000行,其中id = Query1,1000 行,id = 2,等等.带有limit(100)的查询命中前100行,id = 1,unquifies,然后返回一个结果对象,因为他们都是id = 1.但是distinct(),突然间我们得到了100行具有不同身份的行,即"id = 1","id = 2","id = 3". Query然后将这些行中的每一行分配给TestSet身份映射中的新对象,然后返回100行.
设置echo='debug'您Engine暂时将显示SQL被发射以及回来的结果行.当您看到许多结果行都具有相同的主键时,您知道Query当被要求返回完整实体时,将所有这些冗余标识唯一,直到每行所代表的单个对象.
| 归档时间: |
|
| 查看次数: |
2433 次 |
| 最近记录: |