2016-07-25 2 views
1

"시나리오"라는 특정 테이블에 대한 기존 레코드의 열 값을 사용자가 업데이트 할 수 있도록 시도하고 있습니다. 업데이트되는 레코드는이 클래스의 각 인스턴스에 고유 한 "Scenario_Key"라는 인덱스 열로 식별됩니다. 이미 가지고있는 코드는 키, 값 쌍의 사전을 생성합니다. 여기서 key은 업데이트되는 열의 이름이고 value은 값으로 삽입됩니다. SQLite는 데이터베이스를 업데이트하기 위해 나는 노력하고있어 다음Python sqlite3 OperationalError : near "?": 구문 오류

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

관련 문제