cx_Oracle: Hvordan kan jeg iterere over et resultatsett?

stemmer
37

Det er flere måter å veksle over et resultatsett. Hva er kompromisset av hver?

Publisert på 03/08/2008 klokken 01:15
kilden bruker
På andre språk...                            


3 svar

stemmer
36

Den kanoniske måten er å bruke den innebygde markøren iterator.

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

Du kan bruke fetchall()for å få alle rader på en gang.

for row in curs.fetchall():
    print row

Det kan være praktisk å bruke dette for å skape en Python liste som inneholder verdiene som returneres:

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

Dette kan være nyttig for mindre resultatsett, men kan ha dårlige bivirkninger hvis resultatsettet er stort.

  • Du må vente på hele resultatet satt til å bli returnert til klienten prosessen.

  • Du kan spise opp mye minne i klienten for å holde bygget opp listen.

  • Det kan ta en stund for Python å konstruere og dekonstruere listen som du kommer til å umiddelbart kaste anyways.


Hvis du vet at det er en enkelt rad blir returnert i resultatsettet du kan ringe fetchone()for å få én rad.

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

Til slutt kan du sløyfe over resultatsettet henter en rad om gangen. Vanligvis er det ingen spesiell fordel i å gjøre dette på nytt med iterator.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Svarte 03/08/2008 kl. 01:17
kilden bruker

stemmer
22

Min foretrukne måte er markøren iterator, men innstillingen først arraysize eiendom for markøren.

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

I dette eksempelet vil cx_Oracle hente rader fra Oracle 256 rader på en gang, noe som reduserer antall nettverksrundturer som må utføres

Svarte 24/09/2008 kl. 02:51
kilden bruker

stemmer
5

Det er også helt psyco-pgser ut til å gjøre det ... Fra hva jeg samle, synes det å skape ordbok lignende rad-fullmakter til å kartlegge nøkkel oppslag i minnet blokken returnert av spørringen. I så fall henter hele svaret og arbeider med en lignende proxy-fabrikken over radene virker som nyttig idé. Kom til å tenke på det selv, det føles mer som Lua enn Python.

I tillegg bør dette være aktuelt for alle PEP-249 DBAPI2.0 grensesnitt, ikke bare Oracle, eller mente du bare raskest bruke Oracle ?

Svarte 24/08/2008 kl. 17:28
kilden bruker

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