SQL 쿼리를 동적으로 생성할 때, 컬럼명이나 파라미터가 예약어(keyword) 와 충돌하거나 특수문자가 포함되어 오류가 발생하는 경우가 종종 있습니다. 이럴 때, 컬럼명을 쌍따옴표(" ") 로 감싸주는 것이 좋은 해결책이 될 수 있습니다.
이번 글에서는 Python의 re
(정규식) 모듈을 사용하여 쿼리 문자열에서 예약어가 아닌 단어(컬럼명)를 찾아 자동으로 쌍따옴표를 추가하는 방법을 알아보겠습니다.
문제 상황
"test_parameter > 0 and TEST_PARAMETER22 <= 7 or value!=123"
와 같은 쿼리 문자열이 있다고 가정해 봅시다. 이 쿼리를 파싱(parsing) 해서 test_parameter
, TEST_PARAMETER22
, value
와 같은 컬럼명만 골라내고, 이들을 "test_parameter"
, "TEST_PARAMETER22"
, "value"
처럼 쌍따옴표로 감싸고 싶습니다.
하지만 and
, or
, not
같은 SQL 예약어는 제외해야 합니다.
코드 분석
아래의 Python 함수가 이 작업을 수행합니다.
import re
def quote_parameters(expr: str) -> str:
# 1. SQL 예약어 목록 정의
keywords = {"and", "or", "not"}
# 2. 정규식 대체 함수(replacer) 정의
def replacer(match):
word = match.group(0) # 매치된 단어 전체를 가져옵니다.
# 매치된 단어가 예약어인지 확인하고, 아니면 쌍따옴표를 추가합니다.
return word if word in keywords else f'"{word}"'
# 3. 정규식 패턴을 사용하여 문자열 대체
# '\b([A-Za-z_][A-Za-z0-9_]*)\b' 패턴은 유효한 변수명/컬럼명을 찾습니다.
# re.sub()는 패턴에 매치되는 모든 부분을 replacer 함수가 반환하는 값으로 교체합니다.
return re.sub(r'\b([A-Za-z_][A-Za-z0-9_]*)\b', replacer, expr)
# 사용 예시
expr = "test_parameter > 0 and TEST_PARAMETER22 <= 7 or value!=123"
print(quote_parameters(expr))
# 결과: "test_parameter" > 0 and "TEST_PARAMETER22" <= 7 or "value"!=123
keywords = {"and", "or", "not"}
: 쌍따옴표를 붙이지 않을 예약어(키워드) 들을 집합(set)으로 정의합니다. 집합은 검색 속도가 빨라 다수의 키워드를 처리할 때 효율적입니다.\b([A-Za-z_][A-Za-z0-9_]*)\b
: 이 부분이 핵심 정규식 패턴입니다.\b
: 단어 경계(word boundary)를 나타냅니다. 이 덕분에parameter
가test_parameter
의 일부가 아닌 독립적인 단어로 인식됩니다.[A-Za-z_]
: 첫 글자는 영문자 또는 언더스코어(_
)여야 합니다.[A-Za-z0-9_]*
: 그 뒤에는 영문자, 숫자 또는 언더스코어가 0번 이상 반복될 수 있습니다.- 이 패턴은 일반적인 프로그래밍 언어의 변수명 또는 데이터베이스의 컬럼명 규칙을 잘 따릅니다.
re.sub(pattern, repl, string)
:re.sub
함수는 정규식 패턴에 맞는 부분을 새로운 값으로 대체하는 역할을 합니다. 여기서는 대체할 값을replacer
함수로 지정했습니다.
replacer
함수의 역할
replacer
함수는 re.sub
에 의해 패턴에 매치되는 모든 단어에 대해 호출됩니다.
match.group(0)
:match
객체에서 매치된 전체 문자열, 즉 단어를 가져옵니다.word in keywords
: 가져온 단어가 미리 정의해 둔 예약어 목록에 있는지 확인합니다.return
: 만약 예약어라면word
그대로를 반환하고, 아니라면f'"{word}"'
와 같이 쌍따옴표를 추가한 문자열을 반환합니다.
최종 결과
위 코드를 실행하면 다음과 같이 test_parameter
, TEST_PARAMETER22
, value
와 같은 컬럼명에만 쌍따옴표가 추가된 것을 확인할 수 있습니다.
"test_parameter" > 0 and "TEST_PARAMETER22" <= 7 or "value"!=123
반응형
'개발 (Development) > Python' 카테고리의 다른 글
[Python] 데이터프레임에서 열 선택하기: `df.iloc[:, idxs]`의 의미 (0) | 2025.09.28 |
---|---|
[Python] `__pycache__`란 무엇인가? (0) | 2025.09.19 |
[Python] RuntimeError: module compiled against API version 0xf but this version of numpy is 0xe 에러 해결 (0) | 2025.09.19 |
[Python] requests에서 대량 배열 전송 시 403 오류 해결 (0) | 2025.09.07 |
[Python] MAU(Monthly Active Users) 계산 방법 (2) | 2025.08.10 |