91 votes

Sqlalchemy - Différence entre la requête et les requêtes.le tout dans des boucles for

Je voudrais demander quelle est la différence entre

for row in session.Query(Model1):
    pass

et

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

est le premier d'une certaine manière un itérateur de bombarder votre base de données avec un seul des requêtes et le dernier "désireux" interroge la chose comme une liste (comme la plage(x) vs xrange(x)) ?

109voto

Gunnlaugur Briem Points 1150

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X