Python sqlite3 OperationalError:near“?”:语法错误

时间:2016-07-25 20:49:10

标签: python-2.7 sqlite

尝试让用户更新名为“Scenario”的特定表的现有记录的列值。正在更新的记录由名为“Scenario_Key”的索引列标识,该列对于此类的每个实例都是唯一的。我已经拥有的代码生成了一个键值对的字典,其中key是要更新的列的名称,value是插入其中的值。要更新sqlite数据库,我正在尝试以下方法:

cursor.execute("""UPDATE Scenario SET ?=? WHERE Scenario_Key=?;""", (key, new_val, self.scenario_key))

但是当我尝试通过单击“保存并关闭”按钮执行时,我得到以下内容:

Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1536, in __call__
return self.func(*args)
File "/Users/xxx/Documents/Consulting/DCA/Damage Control Assistant/EditScenarioWindow.py", line 91, in <lambda>
SaveAndCloseButton = Button(ButtonFrame, text="Save and Close", command=lambda: self.SaveAndCloseWindow())
File "/Users/xxx/Documents/Consulting/DCA/Damage Control Assistant/EditScenarioWindow.py", line 119, in SaveAndCloseWindow
cursor.execute(cmd_string, (key, new_val, self.scenario_key))
OperationalError: near "?": syntax error

我已经阅读了sqlite3.OperationalError: near "?": syntax error,但我正在尝试执行单个sqlite查询,其中所有变量都已经计算过,而不是从数据库中获取值并从那里构建查询。我将位置参数作为元组提供。那么为什么sqlite3不像我提交的查询那样?

1 个答案:

答案 0 :(得分:1)

您无法对列名称进行参数化。虽然可以认识到SQL Injection攻击的可能性,但您可以这样做:

cursor.execute("""UPDATE Scenario 
                     SET {}=? 
                   WHERE Scenario_Key=?;""".format(key), 
               (new_val, self.scenario_key))