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()