cx_Oracle: Jak mohu iteraci přes výsledek nastavit?

hlasů
35

Existuje několik způsobů, jak iteraci přes sadu výsledků. Jaké jsou kompromis každého?

Položena 03/08/2008 v 02:15
zdroj uživatelem
V jiných jazycích...                            


3 odpovědí

hlasů
35

Kanonický způsob, jak je použít vestavěný-in kurzor iterátor.

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

Můžete použít fetchall(), aby byly všechny řádky najednou.

for row in curs.fetchall():
    print row

To může být výhodné použít k vytvoření seznamu Python, který obsahuje hodnoty vrácené:

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

To může být užitečné pro menší sady výsledků, ale může mít negativní vedlejší účinky, pokud sada výsledků je velký.

  • Budete muset počkat na celou sadu výsledků, které mají být vráceny do svého procesu klienta.

  • Můžete jíst až hodně paměti vašeho klienta držet zastavěný seznamu.

  • To může nějakou dobu trvat, než Python k výstavbě a dekonstrukci seznamu, který hodláte ihned vyhoďte tak jako tak.


Pokud víte, že je to jeden řádek vracených v sadě výsledků můžete volat fetchone()získat jeden řádek.

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

A konečně, můžete si smyčku přes sadu výsledků načítání jeden řádek najednou. Obecně platí, že neexistuje žádný zvláštní výhodu v tom to skončí s použitím iterace.

row = curs.fetchone()
while row:
    print row
    row = curs.fetchone()
Odpovězeno 03/08/2008 v 02:17
zdroj uživatelem

hlasů
21

Můj preferovaný způsob je kurzor iterátor, ale nastavení nejprve arraysize vlastnost kurzoru.

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

V tomto příkladu cx_Oracle stáhne řádky z Oracle 256 řádků v době, snížení počtu síťových okružních jízd, které musí být provedeny

Odpovězeno 24/09/2008 v 03:51
zdroj uživatelem

hlasů
4

K dispozici je také způsob, jak psyco-pgse zdá, jak to udělat ... Z toho, co jsem pochopil, jak se zdá k vytvoření slovníku podobné řádek proxy mapovat klíče vytahovat do paměťového bloku vrácené dotazem. V takovém případě načítání celou odpověď a pracuje s podobným proxy továrně přes řádky jeví jako užitečný nápad. Přijďte se myslet na to, i když to působí spíše jako Lua než Python.

Také by to mělo být použitelné pro všechny DBAPI2.0 PEP-249 rozhraní, ne jen Oracle, nebo jste na mysli jen nejrychlejší pomocí Oracle ?

Odpovězeno 24/08/2008 v 18:28
zdroj uživatelem

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