cx Oracle: jak iterować zestaw wyników?

Istnieje kilka sposobów iteracji zbioru wyników. Jaki jest kompromis każdego z nich?

Author: Mark Harrison, 2008-08-03

3 answers

Kanonicznym sposobem jest użycie wbudowanego iteratora kursora.

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

Możesz użyć fetchall(), aby uzyskać wszystkie wiersze naraz.

for row in curs.fetchall():
    print row

Może być wygodne użycie tego do utworzenia listy Pythona zawierającej zwracane wartości:

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

Może to być przydatne dla mniejszych zestawów wyników, ale może mieć złe skutki uboczne, jeśli zestaw wyników jest duży.

  • Musisz poczekać aż cały zestaw wyników zostanie zwrócony do twój proces klienta.

  • Możesz jeść up a lot of memory in your client to hold lista Planetoid

  • Może trochę potrwać Budowa i dekonstrukcja Pythona lista, którą masz zamiar natychmiast odrzucić tak czy inaczej.


Jeśli wiesz, że w zestawie wynikowym jest zwracany pojedynczy wiersz, możesz wywołać fetchone(), aby uzyskać pojedynczy wiersz.

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

Na koniec możesz zapętlić zestaw wynikowy pobierający jeden wiersz na raz. Ogólnie rzecz biorąc, nie ma szczególnej przewagi w robieniu tego nad używając iteratora.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
 50
Author: Mark Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-15 20:47:11

Moim preferowanym sposobem jest iterator kursora, ale najpierw ustawienie właściwości arraysize kursora.

curs.execute('select * from people')
curs.arraysize = 256
for row in curs:
    print row
W tym przykładzie cx_Oracle pobierze wiersze z 256 wierszy Oracle na raz, zmniejszając liczbę połączeń w obie strony sieci, które należy wykonać
 25
Author: Aurelio Martin Massoni,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 02:51:00

Jest też sposób psyco-pg wydaje się to robić... Z tego, co wiem, wydaje się, że tworzy słownikowe proxy wierszowe, aby mapować wyszukiwanie kluczy do bloku pamięci zwracanego przez zapytanie. W takim przypadku pobranie całej odpowiedzi i praca z podobnym proxy-factory nad wierszami wydaje się przydatnym pomysłem. Jeśli o tym pomyśleć, to bardziej przypomina Lua niż pytona.

Również powinno to mieć zastosowanie do wszystkich Pep-249 DBAPI2.0 interfejsów, nie tylko Oracle, czy miałeś na myśli tylko najszybszy za pomocą Oracle ?

 6
Author: Anders Eurenius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-24 17:28:26