cx_Oracle: come posso scorrere un set di risultati?
https://stackoverflow.com/questions/594
Full question
SOLUZIONE
Il modo canonico è usare l'iteratore del cursore incorporato.
curs.execute('select * from people')
for row in curs:
print row
Puoi usare fetchall ()
per ottenere tutte le righe contemporaneamente.
for row in curs.fetchall():
print row
Può essere conveniente usarlo per creare un elenco Python contenente i valori restituiti:
curs.execute('select first_name from people')
names = [row[0] for row in curs.fetchall()]
Questo può essere utile per set di risultati più piccoli, ma può avere effetti collaterali negativi se il set di risultati è grande.
-
Devi aspettare che venga restituito l'intero set di risultati processo client.
-
Puoi conservare molta memoria nel tuo client da conservare l'elenco incorporato.
-
Potrebbe essere necessario del tempo prima che Python costruisca e decostruisca il file elenco che eliminerai immediatamente comunque.
Se sai che viene restituita una singola riga nel set di risultati, puoi chiamare fetchone ()
per ottenere la riga singola.
curs.execute('select max(x) from t')
maxValue = curs.fetchone()[0]
Infine, puoi passare in rassegna il set di risultati recuperando una riga alla volta. In generale, non c'è alcun vantaggio particolare nel farlo rispetto all'uso dell'iteratore.
row = curs.fetchone()
while row:
print row
row = curs.fetchone()
ALTRI SUGGERIMENTI
Il mio modo preferito è l'iteratore del cursore, ma impostando prima la proprietà array del cursore.
curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
print row
In questo esempio, cx_Oracle recupererà le righe da Oracle 256 alla volta, riducendo il numero di round trip di rete che devono essere eseguiti
C'è anche il modo in cui psyco-pg
sembra farlo ... Da quello che raccolgo, sembra creare proxy di riga simili a dizionario per mappare la ricerca delle chiavi nel blocco di memoria restituito dal query. In tal caso, recuperare l'intera risposta e lavorare con una proxy-factory simile sulle righe sembra un'idea utile. Vieni a pensarci, però, sembra più Lua che Python.
Inoltre, questo dovrebbe essere applicabile a tutti PEP-249 DBAPI2.0 interfacce, non solo Oracle, o intendevi solo più veloce usando Oracle ?