[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