"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 시퀀스와 문자열을 사용할 때 SQLite의 매개변수 대체 문제를 해결하는 방법은 무엇입니까?

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

2024-11-08에 게시됨
검색:849

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

SQLite의 매개변수 대체 문제 해결

Python을 사용하여 SQLite3에서 매개변수 대체를 활용할 때 문제가 발생합니까? 심층 조사 및 해결 방법을 안내해 드립니다.

SQL 인젝션을 방지하기 위해 '?'를 이용한 매개변수 대체가 가능합니다. 바람직하다. 그러나 이 방법을 사용하면 오류가 발생할 수 있습니다. 예를 들어 다음 코드를 사용하면:

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", item)
    self.cursor.close()

"sqlite3.ProgrammingError: 잘못된 바인딩 수가 제공됨" 오류가 발생합니다. 이는 명령문이 하나의 바인딩을 지정하지만 8개가 제공됨을 나타냅니다. 이 문제는 데이터베이스 테이블의 초기 생성에서 발생합니다. 데이터베이스 생성을 담당하는 모듈에는 8개의 바인딩이 포함되어 있어 불일치가 발생합니다.

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)""")

아이러니하게도 '?'를 대체합니다. 덜 안전한 '%s'를 사용하면 문제가 해결됩니다.

for item in self.inventory_names:
    self.cursor.execute("SELECT weight FROM Equipment WHERE name = '%s'" % item)
    self.cursor.close()

이 역설의 이유는 Cursor.execute()가 두 번째 매개변수를 받아들이는 방식에 있습니다. 단일 문자열 대신 시퀀스가 ​​필요하지만 길이가 8인 문자열을 전달하고 있습니다.

이 문제를 해결하려면 코드를 다음과 같이 조정하세요.

self.cursor.execute("SELECT weight FROM Equipment WHERE name = ?", [item])

이 수정을 통해 매개변수 대체가 의도한 대로 작동하도록 보장합니다. Cursor.execute()에 전달된 두 번째 매개변수가 SQL 문의 지정된 바인딩 수와 일치하는지 항상 확인하세요.

릴리스 선언문 이 글은 1729322897에서 재인쇄되었습니다. 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3