python - cx_Oracle: Wie iteriere ich über eine Ergebnismenge?

Translate

Es gibt verschiedene Möglichkeiten, eine Ergebnismenge zu durchlaufen. Was sind die Kompromisse von jedem?

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

Alle Antworten

Translate

Die kanonische Methode besteht darin, den integrierten Cursor-Iterator zu verwenden.

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

Sie können verwendenfetchall()um alle Zeilen auf einmal zu bekommen.

for row in curs.fetchall():
    print row

Es kann praktisch sein, damit 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 schlimme Nebenwirkungen haben, wenn die Ergebnismenge groß ist.

  • Sie müssen warten, bis die gesamte Ergebnismenge an Ihren Client-Prozess zurückgegeben wird.

  • Möglicherweise verbrauchen Sie viel Speicher in Ihrem Client, um die erstellte Liste zu speichern.

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


Wenn Sie wissen, dass in der Ergebnismenge eine einzelne Zeile zurückgegeben wird, können Sie diese aufrufenfetchone()um die einzelne Reihe zu bekommen.

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 hat dies keinen besonderen Vorteil gegenüber der Verwendung des Iterators.

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

Mein bevorzugter Weg ist der Cursor-Iterator, aber zuerst wird die Arraysize-Eigenschaft des Cursors festgelegt.

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

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

Quelle
Translate

Da ist auch der Wegpsyco-pgscheint 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 Sie sich das vorstellen, fühlt es sich eher nach Lua als nach Python an.

Dies sollte auch für alle geltenPEP-249 DBAPI2.0Schnittstellen, nicht nur Oracle, oder meinten Sie nuram schnellstenmitOrakel?

Quelle