我正在尝试设置一个创建我需要的表的设置文件。我从这开始。
cursor.execute("CREATE TABLE IF NOT EXISTS measurement (time DATETIME)")
这很有效。将它移动到使用参数我尝试了很多不同的变化,但都得到了大致相同的错误。
table_name = scrub_table_name('measurement')
field_name = some_function1('time')
field_type = some_function2('DATETIME')
cursor.execute("CREATE TABLE IF NOT EXISTS {} (? ?)".format(table_name), (field_name, field_type))
我得到的错误就是这个。
sqlite3.OperationalError:near“?”:语法错误
如果我使用绑定版本,我会得到相同的结果。
cursor.execute("CREATE TABLE IF NOT EXISTS {} (:fn :ft)".format(table_name), {"fn" : field_name, "ft" : field_type})
我收到此错误。
sqlite3.OperationalError:near“:ffn”:语法错误
就这样,我的问题没有混淆。 显然我确实需要将表名移动到我自己擦洗并插入到字符串中,因为sqlite execute将不接受查询的这一部分的参数。因此ob.format()。虽然我有兴趣在这方面犯错,但我最感兴趣的是如何制作? of:fn参数工作。 我在home-brew配置的Mac 10.12.6上使用Python 3.6.2和sqlite3.16.0,而不是我希望更改它,因为我还在Debian系统上测试了相同的错误。
答案 0 :(得分:1)
参数化SQL表达式仅用于参数化文字值,而不用于表/列名称或数据类型。例如,以下是传递给cursor.execute()
的有效命令:
INSERT INTO table_name VALUES (?, ?);
SELECT * FROM table_name WHERE column_name = ?;
UPDATE table_name SET col1 = ? WHERE col2 = ?;
但CREATE TABLE IF NOT EXISTS table_name (? ?)
不是,因为用文字值替换?
将始终产生语法无效的命令。