[PostgreSQL] Python을 이용해서 DDL 문에서 Table DDL 문만 발라내기

Ja L·2024년 2월 19일
0

[PostgreSQL] Operation

목록 보기
29/39
import re

def extract_create_table(ddl_script):
    """
    주어진 DDL 스크립트에서 테이블 생성 구문만 추출하는 함수
    """
    # 테이블 생성 구문을 찾기 위한 정규 표현식
    pattern = re.compile(r'(CREATE TABLE(?: IF NOT EXISTS)? [^;]+;)')

    # 추출된 테이블 생성 구문을 담을 리스트
    create_table_statements = []

    # DDL 스크립트에서 테이블 생성 구문을 찾아서 리스트에 추가
    for match in pattern.finditer(ddl_script):
        create_table_statements.append(match.group(1))

    return create_table_statements

def main():
    # pg_dump로 추출한 DDL 스크립트 파일의 경로
    ddl_script_file = 'C:\\Users\\pg_dumpall.sql'

    # DDL 스크립트 파일 열기
    with open(ddl_script_file, 'r', encoding='UTF8') as f:
        ddl_script = f.read()

    # 테이블 생성 구문만 추출
    create_table_statements = extract_create_table(ddl_script)

    # 테이블 생성 구문을 담은 파일 생성
    with open('create_tables.sql', 'w', encoding='UTF8') as f:
        for statement in create_table_statements:
            f.write(statement + '\n\n')

    print("테이블 생성 구문이 성공적으로 추출되었습니다.")

if __name__ == "__main__":
    main()

이렇게 다양한 DDL문이 섞여있지만 해당 파이썬 스크립트를 이용하면 아래처럼 깨끗하게 TABLE DDL문만 발라낼 수 있습니다.

fdw를 활용해서 마이그레이션을 할 때 해당 스크립트를 고도화해서 완전 자동화도 만들어봐야겠네요.

✔ 정규표현식 비캡쳐그룹

늘 느끼는거지만 정규표현식을 활용할 줄 알면 여러모로 편합니다.
비캡쳐그룹에 대해 기술합니다.

pattern = re.compile(r'(CREATE TABLE(?: IF NOT EXISTS)? [^;]+;)')

"CREATE TABLE" 및 "CREATE TABLE IF NOT EXISTS" 두 가지 패턴을 모두 포함하여 검색하려면 정규 표현식을 위처럼 사용할 수 있습니다.

    for match in pattern.finditer(ddl_script):
        create_table_statements.append(match.group(1))

위처럼 사용할 때 group(0)을 이용하면 "CREATE TABLE IF NOT EXISTS" 는 "CREATE TABLE IF NOT EXISTS"로 전체 출력을 하게됩니다. 하지만 group(1) 을 이용하면 "CREATE TABLE IF NOT EXISTS" 는 "CREAETE TABLE" 로 출력되게 됩니다.




기존 DDL 스크립트에서 테이블 생성 구문을 삭제하고, 추출한 구문만을 사용하여 새로운 파일을 작성하는 방법은 다음과 같이 구현할 수 있습니다.

import re

def extract_create_table(ddl_script):
    """
    주어진 DDL 스크립트에서 테이블 생성 구문만 추출하는 함수
    """
    # 테이블 생성 구문을 찾기 위한 정규 표현식
    pattern = re.compile(r'(CREATE TABLE(?: IF NOT EXISTS)? [^;]+;)')

    # 추출된 테이블 생성 구문을 담을 리스트
    create_table_statements = []

    # DDL 스크립트에서 테이블 생성 구문을 찾아서 리스트에 추가
    for match in pattern.finditer(ddl_script):
        create_table_statements.append(match.group(1))

    # 추출한 테이블 생성 구문을 기존 DDL 스크립트에서 삭제
    cleaned_ddl_script = pattern.sub('', ddl_script)

    return create_table_statements, cleaned_ddl_script

def main():
    # pg_dump로 추출한 DDL 스크립트 파일의 경로
    ddl_script_file = 'path/to/your/ddl_script.sql'

    # 새로운 파일에 쓸 파일의 경로
    output_file_path = 'path/to/your/new_ddl_script.sql'

    # DDL 스크립트 파일 열기
    with open(ddl_script_file, 'r', encoding='UTF8') as f:
        ddl_script = f.read()

    # 테이블 생성 구문 추출 및 기존 DDL 스크립트에서 삭제
    create_table_statements, cleaned_ddl_script = extract_create_table(ddl_script)

    # 새로운 파일에 테이블 생성 구문 쓰기
    with open(output_file_path, 'w', encoding='UTF8') as f:
        for statement in create_table_statements:
            f.write(statement + '\n\n')

    print("테이블 생성 구문이 성공적으로 추출되어 새로운 파일에 작성되었습니다.")

if __name__ == "__main__":
    main()
profile
DB Engineer

0개의 댓글

관련 채용 정보