cx_Oracle: Come faccio a iterare su un set di risultati?

voti
35

Ci sono diversi modi per iterare su un set di risultati. Quali sono il compromesso di ciascuno?

È pubblicato 03/08/2008 alle 00:15
fonte dall'utente
In altre lingue...                            


3 risposte

voti
35

Il modo canonico è quello di utilizzare l'iteratore cursore del built-in.

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

È possibile utilizzare fetchall()per ottenere tutte le righe in una sola volta.

for row in curs.fetchall():
    print row

Può essere conveniente usare questo per creare una lista Python che contiene i valori restituiti:

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

Questo può essere utile per il set di risultati più piccoli, ma può avere effetti collaterali male se il set di risultati è grande.

  • Devi aspettare per l'intero set di risultati da restituire al processo client.

  • Si può mangiare un sacco di memoria nel vostro client di tenere l'elenco abitato.

  • Si può prendere un po 'per Python per costruire e decostruire la lista che si sta andando a eliminare immediatamente ogni modo.


Se sapete che c'è una sola riga viene restituito nel set di risultati è possibile chiamare fetchone()per ottenere la singola riga.

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

Infine, è possibile un loop all'interno di set di risultati recupero una riga alla volta. In generale, non c'è nessun particolare vantaggio nel fare questo corso utilizzando l'iteratore.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Risposto il 03/08/2008 a 00:17
fonte dall'utente

voti
4

C'è anche il modo in cui psyco-pgsembra di farlo ... Da quanto ho capito, sembra creare dizionario-come row-proxy per mappare ricerca della chiave nel blocco di memoria restituito dalla query. In tal caso, il recupero la risposta completa e lavorare con un simile proxy-fabbrica sopra le righe sembra un'idea utile. Vieni a pensarci bene, però, ci si sente più come Lua di Python.

Inoltre, questo dovrebbe essere applicabile a tutti i DBAPI2.0 PEP-249 interfacce, non solo Oracle, o volevi dire solo più veloce utilizzando Oracle ?

Risposto il 24/08/2008 a 16:28
fonte dall'utente

voti
21

Il mio modo preferito è l'iteratore cursore, ma impostando prima la proprietà arraysize del cursore.

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

In questo esempio, cx_Oracle preleverà righe Oracle 256 righe alla volta, riducendo il numero di rotazioni di rete che devono essere eseguite

Risposto il 24/09/2008 a 01:51
fonte dall'utente

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