SQLite에서 매개변수 대체 문제 해결
Python을 사용하여 SQLite3에서 매개변수 대체를 사용할 때 문제가 발생합니까? 심층 조사와 해결 방법을 알려드립니다.
SQL 인젝션을 방지하기 위해 '?'를 이용한 매개변수 대체 바람직하다. 그러나 이 방법을 사용하면 오류가 발생할 수 있습니다. 예를 들어, 다음 코드를 사용하면
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item) self.cursor.close()</code>
"sqlite3.ProgrammingError: 잘못된 바인딩 수가 제공됨"이라는 오류가 발생합니다. 이는 문이 하나의 바인딩을 지정하지만 8개가 제공됨을 나타냅니다. 이 문제는 데이터베이스 테이블의 초기 생성에서 발생합니다. 데이터베이스 생성을 담당하는 모듈에는 8개의 바인딩이 포함되어 있어 불일치가 발생합니다.
<code class="python">cursor.execute("""CREATE TABLE Equipment (id INTEGER PRIMARY KEY, name TEXT, price INTEGER, weight REAL, info TEXT, ammo_cap INTEGER, availability_west TEXT, availability_east TEXT)""")</code>
아이러니하게도 '?' 덜 안전한 '%s'를 사용하면 문제가 해결됩니다.
<code class="python">for item in self.inventory_names: self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item) self.cursor.close()</code>
이 역설의 이유는 Cursor.execute()가 두 번째 매개변수를 받아들이는 방식에 있습니다. 단일 문자열 대신 시퀀스가 필요하지만 길이가 8인 문자열을 전달하고 있습니다.
이 문제를 해결하려면 코드를 다음과 같이 조정하세요.
<code class="python">self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])</code>
이 수정 사항은 다음과 같습니다. 매개변수 대체가 의도한 대로 작동하는지 확인합니다. Cursor.execute()에 전달된 두 번째 매개변수가 SQL 문의 지정된 바인딩 수와 일치하는지 항상 확인하세요.
위 내용은 시퀀스와 문자열을 사용할 때 SQLite의 매개변수 대체 문제를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!