본문 바로가기
파이썬

파이썬 SQLite 매개 변수 대체 문제

by º기록 2020. 12. 16.
반응형

Python 2.5에서 SQLite3를 사용하여 목록을 반복하고 항목 이름을 기반으로 데이터베이스에서 항목의 가중치를 가져 오려고합니다.

"?"를 사용해 보았습니다. SQL 주입을 방지하기 위해 제안 된 매개 변수 대체가 작동하지 않습니다. 예를 들어 다음을 사용할 때 :

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

오류가 발생합니다.

sqlite3.ProgrammingError : 잘못된 바인딩 수가 제공되었습니다. 현재 명령문은 1을 사용하고 8 개가 제공됩니다.

나는 이것이 어떻게 든 데이터베이스의 초기 생성으로 인한 것이라고 생각합니다. 실제로 DB를 생성하는 모듈에는 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()

하나만 호출 할 때 8 개의 bindin이 있다고 생각하는 이유를 알 수 없습니다. 어떻게 고칠 수 있습니까?

 

해결 방법

 

Cursor.execute () 메소드는 두 번째 매개 변수로 시퀀스를 예상합니다. 8 자 길이의 문자열을 제공하고 있습니다.

대신 다음 양식을 사용하십시오.

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


 

참조 페이지 https://stackoverflow.com/questions/228912

 

 

반응형

댓글