gpt4 book ai didi

Sqlalchemy - for 循环中 query 和 query.all 之间的区别

转载 作者:行者123 更新时间:2023-12-03 05:27:33 38 4
gpt4 key购买 nike

我想问一下有什么区别

for row in session.Query(Model1):
pass

for row in session.Query(Model1).all():
pass

是第一个迭代器以某种方式用单个查询轰炸您的数据库,而后者“热切”地将整个事物作为列表查询(例如 range(x) 与 xrange(x))?

最佳答案

不,数据库流量没有差异。区别在于,for row in session.Query(Model1) 在将要提供给您的每一行时对每一行进行 ORM 处理,而 for row in session.Query(Model1) ).all() 在开始将它们提供给您之前,ORM 是否对所有行都起作用。

请注意,q.all() 只是 list(q) 的糖衣,即将生成器生成的所有内容收集到列表中。这是source code为此,在 Query 类中(在链接源中找到 def all):

def all(self):
"""Return the results represented by this ``Query`` as a list.

This results in an execution of the underlying query.

"""
return list(self)

...其中 self(查询对象)是一个可迭代对象,即具有一个 __iter__ 方法。

所以逻辑上这两种方式在数据库流量方面是完全一样的;两者最终都会调用query.__iter__()来获取行迭代器,并next()通过它。

实际的区别在于,前者可以在数据到达后立即开始为您提供行,将数据库结果集“流式传输”给您,从而减少内存使用和延迟。我无法确定所有当前的引擎实现都做到了这一点(我希望它们做到了!)。无论如何,后一个版本毫无理由地阻碍了这种效率。

关于Sqlalchemy - for 循环中 query 和 query.all 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1078383/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com