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

voix
35

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

Créé 03/08/2008 à 02:15
source utilisateur
Dans d'autres langues...                            


3 réponses

voix
35

La forme canonique est d'utiliser le curseur intégré iterator.

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 pour créer une liste Python contenant les valeurs retourné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 de mauvais effets secondaires si le jeu de résultats est grande.

  • Vous devez attendre le résultat complet prévu à retourner à votre processus client.

  • Vous pouvez manger beaucoup de mémoire dans votre client de tenir la liste bâtie.

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


Si vous savez qu'il ya une seule ligne étant de retour 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 boucler sur le jeu de résultats la récupération d'une ligne à la fois. En général, il n'y a aucun avantage particulier à faire cela sur l'aide de l'itérateur.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Créé 03/08/2008 à 02:17
source utilisateur

voix
21

Ma façon préférée est le iterator du curseur, mais la mise 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 va chercher les lignes de Oracle 256 lignes à la fois, ce qui réduit le nombre de voyages rondes de réseau qui doivent être effectuées

Créé 24/09/2008 à 03:51
source utilisateur

voix
4

Il y a aussi la voie psyco-pgsemble le faire ... D'après ce que je comprends, il semble créer des lignes proxies comme dictionnaire de carte recherche clé dans le bloc de mémoire renvoyée par la requête. Dans ce cas, aller chercher toute réponse et de travailler avec un proxy usine similaire sur les lignes semble utile idée. Venez y penser bien, il se sent plus comme Lua que Python.

En outre, cela devrait être applicable à tous DBAPI2.0 PEP-249 interfaces, pas seulement Oracle, ou avez - vous dire que le plus rapide en utilisant Oracle ?

Créé 24/08/2008 à 18:28
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more