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内存使用和延迟。 我不能确定所有当前的引擎实现都这样做(我希望他们这样做!)。 无论如何,后一种版本会阻止这种效率,因为没有很好的理由。