[python] sqlite3 a dotazy z promenne
Jan Bednařík
jan.bednarik na gmail.com
Středa Červen 25 17:29:53 CEST 2008
Máš v kódu navíc nějaký středníky navíc. A taky se pořádně podívej,
jak se pracuje s cursory v Python DB-API 2, snažíš se o SQL Injection.
V tomhle případě bys měl udělat:
self.c.execute(self.query)
a pro dotazy s parametry by to mělo vypadat takto:
self.c.execute(self.query, self.params)
kde:
self.query = "SELECT * FROM tabulka WHERE sloupec1 = %s AND slouopec2 = %s"
self.params = (hodnota1, hodnota2)
Víc si nastuduj v tom Python DB-API 2 a v dokumentaci k té knihovně co používáš.
Mimochodem ta třída je divná, opravdu má vypadat takhle?
Honza
2008/6/25 Tomas Pelka <tompelka na gmail.com>:
> Zdravim konferenci,
>
> narazil sem na problem vkladani databazovych dotazu z promenne, resp.
> parametru. Popisi situaci, mam tridu dejme tomu data:
>
> ****************************************************
> import sqlite3
>
> class Data:
> def __init__(self,query):
> self.query = query
> self.conn = sqlite3.connect('db.db')
> self.c = self.conn.cursor()
> self.c.execute('%s' % self.query);
>
> def getRow(self):
> return self.c.fetchone()
> *****************************************************
>
>
> Chtel bych ji jako parametr zadavat cely databazovy dotaz (Pokud je to
> spatne cesta poradte jak na to prosim.).
>
> Pouziji-li teoreticky nebezpecnou metodu s retezcem (%s) dostavam tohle:
> ****************************************************
>>>> import data
>>>> d = data.Data("SELECT * FROM main_t;")
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "data.py", line 10, in __init__
> self.c.execute('%s' % self.query);
> sqlite3.OperationalError: near "SELECT": syntax error
> ****************************************************
>
>
> Pouziji-li dle dokumentace bezpecnou metodu (self.c.execute('?',
> (self.query));) dostavam tohle:
> ****************************************************
>>>> import data
>>>> d = data.Data("SELECT * FROM main_t;")
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "data.py", line 10, in __init__
> self.c.execute('?', (self.query));
> sqlite3.OperationalError: near "?": syntax error
> ****************************************************
>
> Dekuji za rady, hezky den vsem.
>
> --
>
> S pozdravem Tomáš Pelka
> e-mail: tompelka na gmail.com
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
Další informace o konferenci Python