Question

Il existe plusieurs façons de parcourir un ensemble de résultats.Quels sont les compromis de chacun ?

Était-ce utile?

La solution

La méthode canonique consiste à utiliser l'itérateur de curseur intégré.

curs.execute('select * from people')
for row in curs:
    print row

Vous pouvez utiliser fetchall() pour obtenir toutes les lignes à la fois.

for row in curs.fetchall():
    print row

Il peut être pratique d'utiliser ceci pour créer une liste Python contenant les valeurs renvoyées :

curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]

Cela peut être utile pour les jeux de résultats plus petits, mais peut avoir des effets secondaires néfastes si le jeu de résultats est volumineux.

  • Vous devez attendre que l'ensemble des résultats soit renvoyé à votre processus client.

  • Vous pouvez manger beaucoup de mémoire dans votre client pour maintenir la liste créée.

  • Il peut prendre un certain temps à Python pour construire et déconstruire la liste que vous allez de toute façon rejeter immédiatement.


Si vous savez qu'une seule ligne est renvoyée dans le jeu de résultats, vous pouvez appeler fetchone() pour obtenir la seule ligne.

curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]

Enfin, vous pouvez parcourir le jeu de résultats en récupérant une ligne à la fois.En général, il n’y a aucun avantage particulier à procéder ainsi par rapport à l’utilisation de l’itérateur.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()

Autres conseils

Ma méthode préférée est l'itérateur du curseur, mais en définissant d'abord la propriété arraysize du curseur.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row

Dans cet exemple, cx_Oracle récupérera les lignes d'Oracle 256 lignes à la fois, réduisant ainsi le nombre d'allers-retours réseau à effectuer.

Il y a aussi le chemin psyco-pg ça a l'air de le faire...D'après ce que je comprends, il semble créer des proxys de ligne de type dictionnaire pour mapper la recherche de clé dans le bloc de mémoire renvoyé par la requête.Dans ce cas, récupérer la réponse complète et travailler avec une usine proxy similaire sur les lignes semble être une idée utile.À bien y penser, cela ressemble plus à Lua qu'à Python.

De plus, cela devrait s'appliquer à tous PEP-249 DBAPI2.0 interfaces, pas seulement Oracle, ou vouliez-vous dire simplement le plus rapide en utilisant Oracle?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top