cx_Oracle: Hoe kan ik itereren over een resultaat ingesteld?

stemmen
35

Er zijn verschillende manieren om itereren over een resultaat geven. Wat zijn de afweging van elk?

De vraag is gesteld op 03/08/2008 om 02:15
bron van user
In andere talen...                            


3 antwoorden

stemmen
35

De canonieke manier is om de ingebouwde cursor iterator gebruiken.

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

U kunt gebruik maken fetchall()om alle rijen te krijgen in een keer.

for row in curs.fetchall():
    print row

Het kan handig zijn om deze te gebruiken om een ​​Python lijst met de waarden die worden geretourneerd te maken:

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

Dit kan nuttig zijn voor kleinere resultaat sets, maar kan geen slechte bijwerkingen hebben als het resultaat set is groot.

  • Je moet wachten voor de hele set, worden teruggestuurd naar uw klant proces resultaat.

  • U kunt opeten veel geheugen in je client naar de opgebouwde lijst te houden.

  • Het kan een tijdje duren voor Python te bouwen en te deconstrueren de lijst die je gaat onmiddellijk anyways ontdoen.


Als je weet dat er een enkele rij worden teruggestuurd in de tijd die u kunt bellen resultaat fetchone()op de enkele rij te krijgen.

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

Ten slotte kunt u lus over de resultaten met het ophalen van één rij tegelijk. In het algemeen is er geen bijzonder voordeel in dit te doen dan met behulp van de iterator.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
antwoordde op 03/08/2008 om 02:17
bron van user

stemmen
4

Er is ook de manier psyco-pglijkt om het te doen ... Van wat ik heb begrepen, lijkt het woordenboek-achtige rij-proxy's te creëren om de belangrijkste lookup kaart in het geheugen blok geretourneerd door de query. In dat geval is het ophalen van de hele antwoord en het werken met een soortgelijke proxy-fabriek over de rijen lijkt nuttig idee. Kom naar hoewel ik erover nadenk, het voelt meer als Lua dan Python.

Ook moet deze van toepassing zijn voor iedereen PEP-249 DBAPI2.0 interfaces, niet alleen Oracle, of heb je bedoelt gewoon snelste met behulp van Oracle ?

antwoordde op 24/08/2008 om 18:28
bron van user

stemmen
21

Mijn favoriete manier is de cursor iterator, maar het instellen eerst de arraysize eigendom van de cursor.

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

In dit voorbeeld zal cx_Oracle rijen van Oracle ophalen 256 rijen tegelijk verminderen van het aantal netwerk retourreizen die moeten worden uitgevoerd

antwoordde op 24/09/2008 om 03:51
bron van user

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