Python3 и Sqlite3

Модератор: Модераторы разделов

hippi90
Сообщения: 83
ОС: Debian testing

Python3 и Sqlite3

Сообщение hippi90 »

Есть база данных 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
Спасибо сказали:
sciko
Сообщения: 1744
Статус: Ъ-участник
ОС: Debian/Ubuntu/etc

Re: Python3 и Sqlite3

Сообщение sciko »

hippi90 писал(а):
06.04.2011 20:13
cur.execute('''DROP TABLE IF EXISTS ?''', (table,))
Такое и во втором питоне не должно выполняться: функция ждёт строку, а получает строку + кортеж.
Надо это писать или так

Код: Выделить всё

 cur.execute("DROP TABLE IF EXISTS %s" % table)
или так

Код: Выделить всё

 cur.execute("DROP TABLE IF EXISTS {0}".format(table))

Второй вариант более правильный для третьего питона.
Спасибо сказали:
hippi90
Сообщения: 83
ОС: Debian testing

Re: Python3 и Sqlite3

Сообщение hippi90 »

А по ссылке с доками пройти и посмотреть не?
Cursor.execute(sql[, parameters])

Executes an SQL statement. The SQL statement may be parametrized (i. e. placeholders instead of SQL literals).

Функция принимает строку, а также не обязательный аргумент, который представляет собой либо кортеж, либо словарь.
По поводу вашего метода в документации сказано:
Instead, use the DB-API’s parameter substitution. Put ? as a placeholder wherever you want to use a value, and then provide a tuple of values as the second argument to the cursor’s execute() method. ... For example:

Код: Выделить всё

# Never do this -- insecure!
symbol = 'IBM'
c.execute("... where symbol = '%s'" % symbol)

# Do this instead
t = (symbol,)
c.execute('select * from stocks where symbol=?', t)
Спасибо сказали: