我想拉一个创建我需要的表的设置文件。我从此开始。使用参数时使用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系统上测试了相同的错误。
您能否解释为什么我可以在第二个示例中使用表名,但不能在我的版本中使用表名?您是否也可以链接任何有关此文档作为我使用的文档说的,否则。看[这里](https://docs.python.org/2/library/sqlite3.html)。 “ ”相反,使用DB-API的参数替换。将?作为占位符放在任何想要使用值的地方,然后提供一个值元组作为游标execute()方法的第二个参数。 – Rhett
“你能解释为什么我可以在第二个例子中使用表格名称,但不能在我的版本中使用?” - 你是指'SELECT * FROM table_name ...'例子吗? 'table_name'没有变量;这正是我命名示例表的原因,所以很明显它是一个表格。关于文档说什么,他们确认您只能使用占位符来获取SQL *值*,而不是对象名称或类型。 – jwodder
对不起,我打算询问关于列名的问题,我们都没有将表名作为参数传递,但我的列名错误,而不是。我不确定我是否理解我们两种用途之间的区别,除了你们作为选择声明。 – Rhett