sqlalchemy – for循环中查询和query.all之间的区别
我想问一下是什么区别
for row in session.Query(Model1): pass
和
for row in session.Query(Model1).all(): pass
是第一个不知何故迭代器轰炸你的数据库与单个查询和后者“热切”查询整个事情作为一个列表(如范围(X)与Xrange(X))?
不,数据库stream量没有差别。 不同之处在于,在开始给予您之前,前者会在每行中执行ORM工作,而第二个操作将在所有行上执行。
请注意, q.all()
只是list(q)
糖,即收集生成器产生的所有内容到列表中。 这里是它的源代码 ,在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__
方法。
所以在逻辑上这两种方式在数据库stream量方面是完全一样的; 最终都会调用query.__iter__()
来获取一个行迭代器,然后next()
通过它。
实际的区别在于,前者可以在数据到达后立即开始给予行,将数据库结果集“stream式传输”给您,从而减less内存使用和延迟。 我不能确定所有当前的引擎实现都这样做(我希望他们这样做!)。 无论如何,后一种版本会阻止这种效率,因为没有很好的理由。