SQL IN 쿼리에서 플레이스홀더 활용하기
파이썬에서 튜플(tuple) 값을 사용해 SQL의 IN 절 쿼리를 작성할 때는, 쿼리 문자열에 직접 값을 삽입하는 대신 플레이스홀더(placeholder)를 먼저 만들어 두어야 합니다. 이렇게 하면 값들이 자동으로 이스케이프(escape) 처리되어 SQL 인젝션 공격을 예방하고 쿼리 오류도 방지할 수 있습니다.
예제 코드
튜플의 길이에 맞게 물음표(?) 플레이스홀더를 동적으로 생성하는 방법은 다음과 같습니다.
my_tuple = ("Hello", "world", "John")
placeholder = '?'
placeholders = ', '.join(placeholder for _ in my_tuple)
query = 'SELECT name FROM students WHERE id IN (%s)' % placeholders
print(query)생성된 쿼리를 커서(cursor) 객체를 통해 실행합니다.
# 이제 커서를 사용하여 쿼리를 실행합니다 cursor.execute(query, my_tuple)
실행 결과
위 코드를 실행하면 다음과 같은 쿼리 문자열이 출력됩니다.
'SELECT name FROM students WHERE id IN (?, ?, ?)'
execute() 메서드가 호출되면, 쿼리 내의 ? 플레이스홀더들이 튜플에 담긴 값들로 순서대로 대체되며, 각 값은 자동으로 이스케이프 처리되어 안전하게 데이터베이스에 전달됩니다.
핵심 정리
- 튜플 길이만큼
?플레이스홀더를 생성하여IN (...)구문을 완성합니다. - 값은 쿼리 문자열에 직접 넣지 않고
execute()의 두 번째 인자로 전달합니다. - 이 방식은 DB-API 규격을 따르므로 SQL 인젝션 위험을 크게 줄여 줍니다.