복붙노트

[PYTHON] WHERE ___ IN ___ 문 사용

PYTHON

WHERE ___ IN ___ 문 사용

WHERE _ IN _ 문을 올바르게 사용하는 방법을 찾으려고합니다.

정의:

c.execute('''CREATE TABLE IF NOT EXISTS tab (
    _id integer PRIMARY KEY AUTOINCREMENT,
    obj text NOT NULL
    ) ;''')

나는 이런 식으로하려고합니다.

list_of_vars=['foo','bar']
statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'"+"','".join(list_of_vars)+"'")

또는 위의 방법으로 직접 평가 한 결과도 시도해 보았습니다.

statement="SELECT * FROM tab WHERE obj IN (?)"
c.execute(statement,"'foo','bar'")

내가 얻는 오류는 다음과 같습니다.

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 9 supplied

이것은 나에게 오류를주고있다. 이 방법을 사용하면 작동하지만 SQL 주입 공격에 취약하기 때문에 권장하지 않습니다.

statement="SELECT * FROM tab WHERE obj IN ("+"'"+"','".join(statement)+"'"+")

해결법

  1. ==============================

    1.vars 목록과 일치하는 충분한 매개 변수를 작성해야합니다.

    vars 목록과 일치하는 충분한 매개 변수를 작성해야합니다.

    statement = "SELECT * FROM tab WHERE obj IN ({0})".format(', '.join(['?'] * len(list_of_vars)))
    c.execute(statement, list_of_vars)
    

    list_of_vars를 매개 변수 값 목록으로 전달한다는 점에 유의하십시오. ','.join ()을 사용하여 문자열을 생성합니까? 문자를 쉼표로 구분 한 다음 .format ()을 사용하여 명령문에 삽입하십시오.

    긴 변수 목록의 경우 임시 테이블을 사용하여 이러한 값을 보유한 다음 바인드 매개 변수가있는 IN 절이 아닌 임시 테이블에 대해 JOIN을 사용하는 것이 더 효율적일 수 있습니다.

  2. from https://stackoverflow.com/questions/14245396/using-a-where-in-statement by cc-by-sa and MIT license