[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