cx_Oracle : comment parcourir un ensemble de résultats ?

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

请先 登录 后评论

2 réponses

Mark Harrison

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 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 des effets secondaires néfastes si l'ensemble de résultats est volumineux.

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

  • Vous pouvez consommer beaucoup de mémoire dans votre client pour tenir la liste constituée.

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

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

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

Enfin, vous pouvez boucler sur le jeu 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()
请先 登录 后评论
Aurelio Martin Massoni

Ma méthode préférée est l'itérateur de 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

请先 登录 后评论