>  기사  >  백엔드 개발  >  시퀀스와 문자열을 사용할 때 SQLite의 매개변수 대체 문제를 해결하는 방법은 무엇입니까?

시퀀스와 문자열을 사용할 때 SQLite의 매개변수 대체 문제를 해결하는 방법은 무엇입니까?

DDD
DDD원래의
2024-10-19 15:28:30460검색

How to Resolve Parameter Substitution Issues in SQLite When Using Sequences vs. Strings?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.