【问题标题】:Python sqlite3 OperationalError: near "?": syntax errorPython sqlite3 OperationalError:靠近“?”:语法错误
【发布时间】:2016-11-29 08:27:16
【问题描述】:

试图让用户更新名为“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 不喜欢我提交的查询呢?

【问题讨论】:

    标签: python-2.7 sqlite


    【解决方案1】:

    您不能参数化列名。在意识到SQL Injection 攻击的可能性的同时,您可以这样做:

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

    【讨论】:

    • 感谢您的快速回复!这行得通,甚至更好,我想我明白为什么。也感谢您的警告。由于各种原因,安全和注入攻击并不是这个项目的主要问题,但绝对是未来需要牢记的事情。
    • 干杯,伙计。祝您编码愉快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 2019-02-07
    • 2020-02-06
    • 2019-01-12
    • 2014-05-17
    • 2021-10-19
    • 2018-07-27
    相关资源
    最近更新 更多