[Python/PostgreSQL] 정규식을 활용해 SQL 쿼리 파라미터(컬럼명)를 자동으로 감싸기

2025. 9. 28. 02:16·개발 (Development)/Python

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에 의해 패턴에 매치되는 모든 단어에 대해 호출됩니다.

  1. match.group(0): match 객체에서 매치된 전체 문자열, 즉 단어를 가져옵니다.
  2. word in keywords: 가져온 단어가 미리 정의해 둔 예약어 목록에 있는지 확인합니다.
  3. 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
'개발 (Development)/Python' 카테고리의 다른 글
  • [Python] 데이터프레임에서 열 선택하기: `df.iloc[:, idxs]`의 의미
  • [Python] `__pycache__`란 무엇인가?
  • [Python] RuntimeError: module compiled against API version 0xf but this version of numpy is 0xe 에러 해결
  • [Python] requests에서 대량 배열 전송 시 403 오류 해결
LoopThinker
LoopThinker
모르는 것을 알아가고, 아는 것을 더 깊게 파고드는 공간
  • LoopThinker
    CodeMemoir
    LoopThinker
  • 전체
    오늘
    어제
    • 분류 전체보기 (231)
      • 개발 (Development) (165)
        • Algorithm (1)
        • Angular (1)
        • AWS (6)
        • DeepSeek (2)
        • Docker (7)
        • Git (3)
        • Java (34)
        • JavaScript (4)
        • Kafka (5)
        • Kubernetes (4)
        • Linux (7)
        • PostgreSQL (38)
        • Python (31)
        • React (3)
        • TypeScript (3)
        • Vue.js (5)
        • General (11)
      • 데이터 분석 (Data Analysis) (1)
      • 알고리즘 문제 풀이 (Problem Solving.. (27)
      • 자격증 (Certifications) (24)
        • ADsP (14)
        • 정보처리기사 (4)
        • Linux Master (5)
        • SQLD (1)
      • 기술 동향 (Tech Trends) (11)
      • 기타 (Others) (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    백준
    pandas
    java
    PostgreSQL
    백준자바
    MyBatis
    Kubernetes
    오답노트
    Linux master
    Kafka
    백준온라인저지
    리눅스 마스터 2급 2차
    AWS
    데이터분석
    백준알고리즘
    Linux
    springboot
    DevOps
    timescaledb
    ADsP
    python
    자바
    deepseek
    Spring boot
    JPA
    javascript
    Vue.js
    JSON
    docker
    리눅스 마스터 2급
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
LoopThinker
[Python/PostgreSQL] 정규식을 활용해 SQL 쿼리 파라미터(컬럼명)를 자동으로 감싸기
상단으로

티스토리툴바