Skip to content

스크립트 개발 / SQL 구성 DFF.SQL

DFF.SQL(...)은(는) 매개변수가 포함된 SQL을 구성하는 데 사용되며, 문자열 연결을 통해 사용자 입력을 삽입하지 않도록 합니다. 대부분의 SQL 커넥터에는 이미 이 기능이 내장되어 있어 conn.query(sql, sql_params=...) 또는 conn.non_query(...)를 직접 호출할 수 있습니다.

디버깅을 위해 SQL을 명시적으로 포맷해야 하거나, 호출 측에서 최종 SQL 문자열을 받아야 하는 경우에만 DFF.SQL(...)을(를) 별도로 호출하면 됩니다.

매개변수와 자리표시자

매개변수 타입 필수 / 기본값 설명
sql str 필수 매개변수 자리표시자를 포함하는 SQL 문
sql_params list None 자리표시자 순서대로 제공되는 SQL 매개변수
자리표시자 의미 예시 결과
? 값 매개변수, 이스케이프 처리 후 따옴표가 붙음 'user-001'
?? 식별자 또는 SQL 조각, 따옴표가 붙지 않음 users
예시
1
2
3
4
5
sql = DFF.SQL(
    'SELECT * FROM ?? WHERE id = ?',
    ['users', 'user-001'],
)
# SELECT * FROM users WHERE id = 'user-001'

??은(는) 신뢰할 수 없는 입력을 보호하지 않습니다

사용자 입력은 반드시 ?에 넣어야 합니다. 테이블명, 필드명 등의 식별자는 허용 목록 또는 신뢰할 수 있는 구성에서 비롯된 경우에만 ??에 넣을 수 있으며, f-string이나 문자열 연결을 통해 SQL 값을 삽입해서는 안 됩니다.

매개변수 전개

배열 매개변수는 자동으로 여러 값으로 전개되며, 2차원 배열은 여러 행의 값으로 전개됩니다:

배열 전개
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
rows = db.query(
    'SELECT * FROM ?? WHERE status IN (?)',
    ['demo', ['error', 'warning']],
)
# SELECT * FROM demo WHERE status IN ('error', 'warning')

affected_rows = db.non_query(
    'INSERT INTO ?? (id, name) VALUES ?',
    ['demo', [[1, 'a'], [2, 'b']]],
)
# INSERT INTO demo (id, name) VALUES (1, 'a'), (2, 'b')

딕셔너리 매개변수는 여러 할당 표현식으로 전개됩니다:

딕셔너리 전개
1
2
3
4
5
affected_rows = db.non_query(
    'INSERT INTO ?? SET ?',
    ['demo', {'id': 1, 'name': 'a'}],
)
# INSERT INTO demo SET id = 1, name = 'a'

동적 쓰기 또는 삭제 SQL을 실행하기 전에 대상 테이블과 필터 조건을 다시 확인해야 합니다.