使用参数时python3和sqlite3出现语法错误



我正在尝试拉入一个创建所需表的设置文件。我是从这个开始的。

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:接近"?":语法错误

如果我使用绑定版本,我也会得到相同的结果。

cursor.execute("CREATE TABLE IF NOT EXISTS {} (:fn :ft)".format(table_name), {"fn" : field_name, "ft" : field_type})

我得到这个错误。

sqlite3.OperationalError:接近":ffn":语法错误

这样我的问题就不会混淆了。显然,我确实需要将表名移动到我自己清理并插入到字符串中的位置,因为sqlite execute将不接受这部分查询的参数。因此产生了ob.format()。虽然我有兴趣在这方面出错,但我最感兴趣的是如何制作?的:fn参数工作。我在一个家庭酿造配置的Mac 10.12.6上使用Python 3.6.2和sqlite3.16.0,我并不希望这会改变它,因为我也在Debian系统上测试过同样的错误。

参数化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 (? ?)不是,因为用文字值替换那些?总是会产生语法无效的命令。

最新更新