2016-07-25 88 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

相關問題