使用参数时 python3 和 sqlite3 的语法错误
Syntax error with python3 and sqlite3 when using parameters
我正在尝试引入一个设置文件来创建我需要的 tables。我从这个开始。
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" 附近: 语法错误
以免混淆我的问题。
显然我确实需要将 table 名称移动到我自己清理并插入到字符串中的名称,因为 sqlite 执行将不接受这部分查询的参数。因此 ob.format()。虽然我有兴趣在这方面犯错,但我最感兴趣的是如何制作 ? :fn 参数的工作。
我在配置为 Mac 10.12.6 的自制程序上使用 Python 3.6.2 和 sqlite3.16.0,并不是我希望改变它,因为我也在 Debian 系统上测试过相同的错误。
参数化 SQL 表达式仅用于参数化文字值,而不是 table/column 名称或数据类型。例如,以下是传递给 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 (? ?)
不是,因为用文字值替换那些 ?
将始终产生语法无效的命令。
我正在尝试引入一个设置文件来创建我需要的 tables。我从这个开始。
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" 附近: 语法错误
以免混淆我的问题。 显然我确实需要将 table 名称移动到我自己清理并插入到字符串中的名称,因为 sqlite 执行将不接受这部分查询的参数。因此 ob.format()。虽然我有兴趣在这方面犯错,但我最感兴趣的是如何制作 ? :fn 参数的工作。 我在配置为 Mac 10.12.6 的自制程序上使用 Python 3.6.2 和 sqlite3.16.0,并不是我希望改变它,因为我也在 Debian 系统上测试过相同的错误。
参数化 SQL 表达式仅用于参数化文字值,而不是 table/column 名称或数据类型。例如,以下是传递给 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 (? ?)
不是,因为用文字值替换那些 ?
将始终产生语法无效的命令。