2017-10-13 83 views
-1

我想拉一个创建我需要的表的设置文件。我从此开始。使用参数时使用python3和sqlite3的语法错误

cursor.execute("CREATE TABLE IF NOT EXISTS measurement (time DATETIME)") 

This works。将它移动到使用参数我尝试了许多不同的变体,但都得到大致相同的错误。

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执行不会接受这部分查询的参数。因此ob.format()。虽然我会对此感兴趣,但我最感兴趣的是如何制作?作者:fn参数工作。 我在自制配置的Mac 10.12.6上使用Python 3.6.2和sqlite3.16.0,并不是我期望改变它,因为我也在Debian系统上测试了相同的错误。

回答

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 (? ?)并非如此,因为与文字值替换那些?旨意总是产生一个语法无效命令。

+0

您能否解释为什么我可以在第二个示例中使用表名,但不能在我的版本中使用表名?您是否也可以链接任何有关此文档作为我使用的文档说的,否则。看[这里](https://docs.python.org/2/library/sqlite3.html)。 “ ”相反,使用DB-API的参数替换。将?作为占位符放在任何想要使用值的地方,然后提供一个值元组作为游标execute()方法的第二个参数。 – Rhett

+0

“你能解释为什么我可以在第二个例子中使用表格名称,但不能在我的版本中使用?” - 你是指'SELECT * FROM table_name ...'例子吗? 'table_name'没有变量;这正是我命名示例表的原因,所以很明显它是一个表格。关于文档说什么,他们确认您只能使用占位符来获取SQL *值*,而不是对象名称或类型。 – jwodder

+0

对不起,我打算询问关于列名的问题,我们都没有将表名作为参数传递,但我的列名错误,而不是。我不确定我是否理解我们两种用途之间的区别,除了你们作为选择声明。 – Rhett