Non, il n'y a pas de différence en DB de la circulation. La différence est juste que le premier ne l'ORM de travail sur chaque ligne quand il est sur le point de le donner à vous, tandis que le second ne l'ORM de travail sur toutes les lignes, avant de commencer à leur donner pour vous.
Notez que q.all()
est juste un peu de sucre pour list(q)
, c'est à dire la collecte de tout ce qui a abouti par le générateur dans une liste. Voici le code source pour elle, dans l' Query
classe:
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)
... où est - self
, l'objet de requête, est un objet iterable, c'est à dire a un __iter__
méthode.
Donc, logiquement, les deux façons sont exactement les mêmes en termes de DB de la circulation; les deux finissent appelant query.__iter__()
pour obtenir une ligne itérateur, et next()
ing leur chemin à travers elle.
En pratique, la différence est que le premier peut commencer à vous donner des lignes dès que leurs données sont arrivées, le "streaming" de la DB jeu de résultats à vous, avec moins d'utilisation de la mémoire et de temps de latence. Je ne peux pas en état pour assurer que toutes les implémentations de moteurs de le faire (j'espère qu'ils font!). En tout cas, la dernière version empêche que l'efficacité, pour aucune bonne raison.