Найти - Пользователи
Полная версия: Подстановка в Sqlite3
Начало » Базы данных » Подстановка в Sqlite3
1
hippi90
Python изучаю не так давно, в основном на С пишу, Sqlite и того меньше.
Есть база данных Sqlite и скрипт на Python3, который этой базой управляет. В скрипте есть функция, которая создает новую таблицу в базе по шаблону, в качестве аргументов принимает имя базы и имя новой таблицы:
def create_new_table_in_db(db, table):
conn = sqlite3.connect(db)
cur = conn.cursor()

cur.execute('''DROP TABLE IF EXISTS ?''', (table,))
        ...
При выполнении выдает ошибку на последней строке:
cur.execute("DROP TABLE IF EXISTS ?", (table,))
sqlite3.OperationalError: near "?": syntax error
Если заменить ? на имя таблицы, то выполняется без ошибок:
cur.execute("DROP TABLE IF EXISTS test_table")
Смотрел примеры из документации http://docs.python.org/py3k/library/sqlite…=sqlite#sqlite3, смотрел также в нескольких книгах по питону, пример типа такого работает на ура:
data = [("Ivanov", "ASM", ".pdf", "None"),\
("Petrov", "C++", ".pdf", "None"),\
("Sidorov", "Python", ".djvu", "None")]

cur.executemany("""INSERT INTO test_table values(?, ?, ?, ?)""", data)
Почему в первом случае не работает, а во втором работает? Или Sqlite не всегда выполняет подстановку переменных? Где тогда посмотреть список этих случаев?
В официальной документации сказано:
# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)
А если я выполню:
s = "test_table"
cur.execute("DROP TABLE IF EXISTS %s" % s)
Насколько это будет небезопасно, и есть ли “правильные” способы подстановки?
Studentik
hippi90
в качестве аргументов принимает имя базы и имя новой таблицы
Этого синтаксис не позволяет. Параметры могут быть только там, где по синтаксису должен быть expression.

Склеивать динамические запросы к базе безопасно, если только потенциальный злоумышленник не может произвольно менять переменные, из которых склеивается запрос.
http://ru.wikipedia.org/wiki/Внедрение_SQL-кода
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB