python - under - cx_Oracle: Wie wiederhole ich eine Ergebnismenge?




python title distance (2)

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

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

Sie können fetchall() , um alle Zeilen gleichzeitig fetchall() .

for row in curs.fetchall():
    print row

Es kann praktisch sein, dies zu verwenden, um eine Python-Liste zu erstellen, die die zurückgegebenen Werte enthält:

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 bei großen Ergebnismengen schlechte Nebenwirkungen haben.

  • Sie müssen warten, bis die gesamte Ergebnismenge an Ihren Clientprozess zurückgegeben wurde.

  • Sie können viel Speicher in Ihrem Client verbrauchen, um die aufgebaute Liste zu halten.

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

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

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

Schließlich können Sie die Ergebnismenge, die jeweils eine Zeile abruft, über das Ergebnis durchlaufen. Im Allgemeinen hat dies keinen besonderen Vorteil gegenüber der Verwendung des Iterators.

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

Es gibt mehrere Möglichkeiten, über eine Ergebnismenge zu iterieren. Was ist der Kompromiss von jedem?


Es gibt auch die Art psyco-pg Weise, wie psyco-pg es zu tun scheint ... Von dem, was ich psyco-pg scheint es psyco-pg zu erzeugen, um Schlüsselsuche in den von der Abfrage zurückgegebenen Speicherblock einzuordnen. In diesem Fall scheint es nützlich zu sein, die ganze Antwort zu holen und mit einer ähnlichen Proxy-Factory über die Zeilen zu arbeiten. Wenn man darüber nachdenkt, fühlt es sich eher wie Lua als Python an.

Außerdem sollte dies für alle PEP-249-DBAPI2.0- Schnittstellen gelten, nicht nur für Oracle, oder meinten Sie nur, dass Sie Oracle am schnellsten nutzen?





cx-oracle