cx_Oracle: Wie kann ich über ein Ergebnis iterieren eingestellt?

stimmen
35

Es gibt mehrere Möglichkeiten, um eine Ergebnismenge iterieren. Was ist der Kompromiss der einzelnen?

Veröffentlicht am 03/08/2008 um 02:15
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
35

Die kanonische Weise ist die integrierten Cursor Iterator zu verwenden.

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

Sie können mit fetchall()allen Zeilen erhalten sofort.

for row in curs.fetchall():
    print row

Es kann zweckmäßig sein, diese zu verwenden, um eine Python-Liste mit den zurückgegebenen Werten zu schaffen:

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

Dies kann für kleinere Ergebnismengen sinnvoll sein, kann aber schlechte Nebenwirkungen haben, wenn die Ergebnismenge groß ist.

  • Sie haben für das gesamte Ergebnis warten auf Ihren Client-Prozess zurückgegeben werden.

  • Sie können viel Speicher in Ihrem Client die verbauten Liste zu halten auffressen.

  • Es kann eine Weile dauern, Python zu konstruieren und die Liste dekonstruieren, die Sie sowieso sofort verwerfen werden.


Wenn Sie wissen , ist es eine einzige Zeile in dem Ergebnis zurückgegeben wird eingestellt Sie anrufen kann , fetchone()die einzelne Zeile zu erhalten.

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

Schließlich können Sie eine Schleife über die Ergebnismenge zu holen eine Zeile zu einem Zeitpunkt. Im Allgemeinen gibt es keinen besonderen Vorteil in dieser Weise des Iterator über verwenden.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Beantwortet am 03/08/2008 um 02:17
quelle vom benutzer

stimmen
21

Meine bevorzugte Art und Weise ist der Cursor Iterator, zuerst aber die Arraysize Eigenschaft des Cursors einstellen.

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

In diesem Beispiel wird die Anzahl der Netzwerk-Rundfahrten zu reduzieren cx_Oracle wird zu einem Zeitpunkt Reihe von Oracle 256 Zeilen holen, die ausgeführt werden müssen

Beantwortet am 24/09/2008 um 03:51
quelle vom benutzer

stimmen
4

Es gibt auch die Art und Weise , psyco-pges zu tun scheint ... Von dem, was ich sammeln, wie es scheint Wörterbuch ähnliche Zeilen Proxies erstellen abzubilden Schlüsselsuche in den Speicherblock von der Abfrage zurückgegeben. In diesem Fall wird die gesamte Antwort zu holen und die Arbeit mit einer ähnlichen Proxy-Fabrik in den Reihen scheint , wie nützliche Idee. Kommen jedoch , daran zu denken, es eher wie Lua als Python fühlt.

Auch sollte dies für alle anwendbar sein PEP-249 DBAPI2.0 Schnittstellen, nicht nur Oracle, oder meinst du nur am schnellsten mit Oracle ?

Beantwortet am 24/08/2008 um 18:28
quelle vom benutzer

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