Vra

Daar is verskeie maniere om oor 'n resultaatstel te herhaal.Wat is die afwegings van elkeen?

Was dit nuttig?

Oplossing

Die kanonieke manier is om die ingeboude wyseriterator te gebruik.

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

Jy kan gebruik fetchall() om alle rye gelyktydig te kry.

for row in curs.fetchall():
    print row

Dit kan gerieflik wees om dit te gebruik om 'n Python-lys te skep wat die waardes bevat wat teruggestuur word:

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

Dit kan nuttig wees vir kleiner resultatestelle, maar kan slegte newe-effekte hê as die resultaatstel groot is.

  • U moet wag dat die volledige resultaat op u kliëntproses terugbesorg word.

  • U kan baie geheue in u kliënt eet om die beboude lys te hou.

  • Dit kan 'n rukkie duur voordat Python die lys wat u dadelik gaan weggooi, konstrueer en dekonstrueer.


As jy weet daar is 'n enkele ry wat in die resultaatstel teruggestuur word, kan jy bel fetchone() om die enkele ry te kry.

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

Uiteindelik kan u oor die resultaatstel 'n lus maak en een ry op 'n slag haal.Oor die algemeen is daar geen spesifieke voordeel om dit te doen bo die gebruik van die iterator nie.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()

Ander wenke

My voorkeur manier is die wyseriterator, maar stel eers die arraysize-eienskap van die wyser in.

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

In hierdie voorbeeld sal cx_Oracle rye van Oracle 256 rye op 'n slag haal, wat die aantal netwerk heenreise verminder wat uitgevoer moet word

Daar is ook die pad psyco-pg blyk dit te doen ...Van wat ek afneem, lyk dit asof dit woordeboekagtige ry-gevolmagtigdes skep om sleutelopsoek in die geheueblok wat deur die navraag teruggestuur word, te karteer.In daardie geval lyk dit na 'n nuttige idee om die hele antwoord te gaan haal en met 'n soortgelyke proxy-fabriek oor die rye te werk.As u egter daaraan dink, voel dit meer soos Lua as Python.

Dit moet ook op almal van toepassing wees PEP-249 DBAPI2.0 koppelvlakke, nie net Oracle nie, of bedoel jy net vinnigste gebruik Orakel?

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top