python sqlite3 cursor.execute() с параметрами приводит к синтаксической ошибке рядом? (парамстиль qmark)

после поиска до безумия, я решил опубликовать вопрос здесь. Я пытаюсь создать базу данных sqlite3, в которой я хотел бы использовать безопасную функцию подстановки переменных функции cursor.execute(SQL, param). Моя функция выглядит следующим образом:

#!/usr/bin/env python3
#-*- coding: utf-8 -*-

import sqlite3

def create():
    values = ("data")
    sql = "CREATE TABLE IF NOT EXISTS ? ( name TEXT, street TEXT, time REAL, age INTEGER )"

    con = sqlite3.connect("database.db")
    c = con.cursor()
    c.execute(sql, values)
    con.commit()
    c.close()
    con.close()

if __name__ = "__main__":
    create()

Я знаю, что первым аргументом должна быть команда sql в виде строки, а вторым аргументом должен быть кортеж значений, которые должны быть заменены, где? находится в строке sql. Однако, когда я запускаю файл, он возвращает следующую ошибку:

$ ./test.py 

Traceback (most recent call last):
  File "./test.py", line 21, in <module>
    create()
  File "./test.py", line 14, in create
    c.execute(sql, values)
sqlite3.OperationalError: near "?": syntax error

Это также происходит, когда параметру paramstyle присвоено значение named (например, форма :table). Я не могу обнаружить здесь синтаксическую ошибку, поэтому я думаю, что проблема должна быть вызвана где-то в системе. Я протестировал его на установке Archlinux и Debian, и они сообщают мне одну и ту же ошибку.

Теперь дело за вами, так как я уже не знаю, где искать причину.


person user2717483    schedule 07.11.2013    source источник


Ответы (2)


Параметры SQL могут применяться только для вставки данных, но не имен таблиц. Это означает, что параметры даже не анализируются для операторов DDL.

Для этого вам нужно будет использовать форматирование строк:

sql = "CREATE TABLE IF NOT EXISTS {} ( name TEXT, street TEXT, time REAL, age INTEGER )".format(*values)
person Martijn Pieters    schedule 07.11.2013

Я так понимаю, ваш параметр - это имя таблицы?

поэтому ваша команда будет

tbl = 'my_table'
sql = "CREATE TABLE IF NOT EXISTS '%s' ( name TEXT, street TEXT, time REAL, age INTEGER )" % tbl
person user2969047    schedule 08.11.2013
comment
это версия ответа martijn для python 2 - person user2717483; 09.11.2013