Domanda

Esistono diversi modi per eseguire l'iterazione su un set di risultati.Quali sono i compromessi di ciascuno?

È stato utile?

Soluzione

Il modo canonico consiste nell'utilizzare l'iteratore del cursore integrato.

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()]

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

  • Devi attendere che l'intero set di risultati venga restituito al processo del tuo cliente.

  • Puoi consumare molta memoria nel tuo client per tenere l'elenco degli accumuli.

  • Potrebbe volerci un po 'di tempo per Python per costruire e decostruire l'elenco che stai per scartare immediatamente.


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 eseguire il loop sul set di risultati recuperando una riga alla volta.In generale, non vi è alcun vantaggio particolare nel fare ciò rispetto all'utilizzo 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à arraysize del cursore.

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

In questo esempio, cx_Oracle recupererà da Oracle 256 righe alla volta, riducendo il numero di round trip di rete da eseguire

C'è anche il modo psyco-pg sembra che lo faccia...Da quello che ho capito, sembra creare proxy di riga simili a dizionari per mappare la ricerca delle chiavi nel blocco di memoria restituito dalla query.In tal caso, recuperare l'intera risposta e lavorare con una proxy factory simile sulle righe sembra un'idea utile.Ora che ci penso, sembra più Lua che Python.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top