python - cx_Oracle: Comment puis-je itérer sur un jeu de résultats?

Translate

Il existe plusieurs façons d'itérer sur un jeu de résultats. Quels sont les compromis de chacun?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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 utiliserfetchall()pour obtenir toutes les lignes à la fois.

for row in curs.fetchall():
    print row

Il peut être pratique de l'utiliser 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 ensembles de résultats plus petits, mais peut avoir de mauvais effets secondaires si l'ensemble de résultats est volumineux.

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

  • Vous pouvez consommer beaucoup de mémoire dans votre client pour conserver la liste établie.

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


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

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

Enfin, vous pouvez parcourir l'ensemble de résultats en récupérant une ligne à la fois. En général, il n'y a aucun avantage particulier à faire cela par rapport à l'utilisation de l'itérateur.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
La source
Translate

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ère les lignes d'Oracle 256 lignes à la fois, réduisant le nombre d'allers-retours réseau à effectuer

La source
Translate

Il y a aussi le cheminpsyco-pgsemble 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 toute la réponse et travailler avec une usine de proxy similaire sur les lignes semble être une idée utile. À bien y penser, cela ressemble plus à Lua qu'à Python.

En outre, cela devrait s'appliquer à tousPEP-249 DBAPI2.0interfaces, pas seulement Oracle, ou vouliez-vous dire simplementle plus rapideen utilisantOracle?

La source