[python] sqllite - existuje záznam v DB?

Stefan Oravec stefan.oravec na realtime.sk
Čtvrtek Únor 8 13:17:38 CET 2007


Zdravim,

trochu osvety o pisani skalovatelnych a bezpecnych SQL aplikacii nezaskodi ;)

Tvoj selekt by som malinko upravil:

jmeno = "test.txt"
cur.execute('SELECT count(id) FROM soubory WHERE jmeno=?', (jmeno,))

? je placeholder do ktoreho sa v nabinduje hodnota premennej jmeno

Nepouzivanie "bindovanych premennych" (bind variables) v OLTP  
systemoch je najlepsi sposob ako zabit skalovatelnost (nebudem  
zachadzat do detailov, to by bolo na iny mailinglist). Ako vzdy a  
vsade plati, ze zalezi na konkretnej situacii. Da sa ale povedat, ze v  
drvivej vecsine pripadov, ked nie su nejako extremne zle distribuovane  
data tak plati:
1) pouzit bind ak sa selekt spusti viac ako raz s roznymi parametrami
2) nepouzit bind ak je to ad hoc vytvoreny selekt

Nezanedbatelny je takisto prinos z hladiska bezpecnosti. Takto  
napisany kod je imunny voci SQL injection.

(http://www.python.org/doc/current/lib/module-sqlite3.html)

S.

Quoting Pavel Svobodník <pavel at svobodnik.cz>:

>
>
>   takze len() se pouzit da. Otazkou ale zustava, proc na elementarni
> zjisteni poctu zaznamy vyhovujicich dane podmince pouzivas projekci
> "*"? Proc nepouzijes count() (pres sikovny index), a pak jen porovnas
> jedinou vyslednou hodnotu na == 0? Netahal bys hromadu dat a nemusel
> bys pocitat len().
>
>   Zkusil bych EXISTS.Miloslav Ponkrác  tak to nakonec řeším takto
> x = cur.execute('SELECT count(id) FROM soubory WHERE
> jmeno="test.txt"').fetchone()[0]
> if x == 0:
>     .....
>
> Pavel S.
>



--
application/x-person


Další informace o konferenci Python