2016-07-25 89 views
1

试图让用户更新名为“Scenario”的特定表的现有记录的列值。正在更新的记录由称为“Scenario_Key”的索引列标识,该列对于该类的每个实例都是唯一的。我已经拥有的代码会生成一个键值对的字典,其中key是正在更新的列的名称,而value是插入其中的值。要更新SQLite数据库我想以下几点:Python sqlite3 OperationalError:接近“?”:语法错误

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?

回答

0

您不能参数化列名称。虽然认识到SQL Injection攻击的可能性,但您可以改为:

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

感谢您的快速响应!这工作,甚至更好,我想我明白为什么。 也感谢您的警告。由于各种原因,安全和注入攻击并不是这个项目的主要关注点,但绝对是未来需要注意的一点。 –

+0

干杯,队友。快乐的编码给你! – bernie

相关问题