Python을 사용하여 SQL에서 주석 제거하기

데이터베이스 프로젝트에서 SQL 스크립트를 처리할 때, 종종 주석으로 인해 문제가 발생할 수 있습니다. 특히 JDBC와 같은 도구를 통해 실행되는 경우, 특수 문자가 포함된 주석은 예기치 않은 오류를 유발할 수 있습니다. 이 글에서는 Python을 활용하여 SQL 코드에서 주석을 제거하는 방법을 살펴보겠습니다.

주석 제거의 필요성

SQL에서 주석은 일반적으로 데이터베이스 엔진에 의해 무시됩니다. 그러나 일부 비표준 데이터베이스 시스템(특히 국내 개발된 데이터베이스)은 특수 문자를 제대로 처리하지 못하는 경우가 많습니다. 이를 방지하기 위해 SQL 코드 내의 모든 주석을 사전에 제거하는 것이 중요합니다.

코드 구현

우선, 주석의 형태는 크게 두 가지로 나눌 수 있습니다: 행 주석(`--`)과 블록 주석(`/* ... */`). 각각의 주석을 제거하기 위한 함수를 작성하겠습니다.

1. 행 주석 제거

행 주석은 `--` 이후의 모든 내용을 무시해야 합니다. 이를 정규 표현식을 사용하여 간단히 처리할 수 있습니다.

import re

# 행 주석 제거 함수
def remove_line_comments(sql_text):
    """
    SQL 텍스트에서 '--'로 시작하는 행 주석을 제거합니다.
    """
    pattern = re.compile(r"--.*\n?")
    return re.sub(pattern, "\n", sql_text)

2. 블록 주석 제거

블록 주석은 `/ *`와 `* /` 사이의 모든 내용을 제거해야 합니다. 이 경우 정규 표현식만으로는 충분하지 않으므로, 문자열을 순회하며 처리합니다.

# 블록 주석 제거 함수
def remove_block_comments(sql_text):
    """
    SQL 텍스트에서 '/* ... */' 형태의 블록 주석을 제거합니다.
    """
    result = []
    inside_comment = False
    i = 0
    while i < len(sql_text):
        if sql_text[i] == '/' and i + 1 < len(sql_text) and sql_text[i + 1] == '*':
            inside_comment = True
            i += 2  # '/*' 건너뛰기
        elif sql_text[i] == '*' and i + 1 < len(sql_text) and sql_text[i + 1] == '/':
            inside_comment = False
            i += 2  # '*/' 건너뛰기
        elif not inside_comment:
            result.append(sql_text[i])
            i += 1
        else:
            i += 1
    return ''.join(result)

테스트 및 실행 결과

아래는 위 함수들을 적용한 예제입니다. 입력된 SQL에서 주석을 성공적으로 제거하는지 확인해 보겠습니다.

if __name__ == "__main__":
    sql_input = '''
-- 이건 SQL 설명입니다.
select '1' as v1, '2' as v2 from dual union all
select '2' as v1, '3' as v2 from dual union all
/* 
   이 부분은 잘못된 쿼리입니다.
   select 1 as v1, 2 as v2 from dual union all
   select 2 as v1, 3 as v2 from dual
*/
select /* inline 주석 */ 'a' as v1, -- v1 컬럼
       'b' as v2 -- v2 컬럼
from dual -- dual은 가상 테이블입니다.
'''

    # 블록 주석 제거
    sql_no_blocks = remove_block_comments(sql_input)
    print("블록 주석 제거 후:")
    print(sql_no_blocks)

    # 행 주석 제거
    sql_cleaned = remove_line_comments(sql_no_blocks)
    print("\n최종 결과:")
    print(sql_cleaned)
위 코드를 실행하면 입력된 SQL에서 모든 주석이 제거된 상태로 출력됩니다. 이를 통해 불필요한 오류를 줄이고, 안정적인 SQL 실행을 보장할 수 있습니다.

태그: python SQL JDBC

5월 31일 05:26에 게시됨