Frage

Es gibt mehrere Möglichkeiten, eine Ergebnismenge zu durchlaufen.Was sind die jeweiligen Kompromisse?

War es hilfreich?

Lösung

Der kanonische Weg besteht darin, den integrierten Cursor-Iterator zu verwenden.

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

Sie können verwenden fetchall() um alle Zeilen auf einmal zu erhalten.

for row in curs.fetchall():
    print row

Dies kann praktisch sein, um eine Python-Liste mit den zurückgegebenen Werten zu erstellen:

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

Dies kann für kleinere Ergebnismengen nützlich sein, kann jedoch schwerwiegende Nebenwirkungen haben, wenn die Ergebnismenge groß ist.

  • Sie müssen warten, bis das gesamte Ergebnis -Set an Ihren Kundenprozess zurückgegeben wird.

  • Sie können viel Speicher in Ihrem Kunden auf sichern, um die aufgebaute Liste zu halten.

  • Es kann eine Weile dauern, bis Python die Liste erstellt und dekonstruiert, die Sie sowieso sofort wegwerfen werden.


Wenn Sie wissen, dass in der Ergebnismenge eine einzelne Zeile zurückgegeben wird, können Sie aufrufen fetchone() um die einzelne Zeile zu erhalten.

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

Schließlich können Sie die Ergebnismenge durchlaufen und jeweils eine Zeile abrufen.Im Allgemeinen bietet dies keinen besonderen Vorteil gegenüber der Verwendung des Iterators.

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

Andere Tipps

Meine bevorzugte Methode ist der Cursor-Iterator, aber ich setze zuerst die Arraysize-Eigenschaft des Cursors.

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

In diesem Beispiel ruft cx_Oracle jeweils 256 Zeilen von Oracle ab, wodurch die Anzahl der durchzuführenden Netzwerk-Roundtrips reduziert wird

Es gibt auch den Weg psyco-pg scheint es zu tun...Soweit ich weiß, scheint es wörterbuchähnliche Zeilen-Proxys zu erstellen, um die Schlüsselsuche dem von der Abfrage zurückgegebenen Speicherblock zuzuordnen.In diesem Fall scheint es eine nützliche Idee zu sein, die gesamte Antwort abzurufen und mit einer ähnlichen Proxy-Factory über die Zeilen zu arbeiten.Wenn ich darüber nachdenke, fühlt es sich jedoch eher wie Lua als wie Python an.

Dies sollte auch für alle gelten PEP-249 DBAPI2.0 Schnittstellen, nicht nur Oracle, oder meinten Sie nur am schnellsten verwenden Orakel?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top