[BTB] 파일 마이그레이션 기능 제작을 위한 고려
파일 구조 마이그레이션을 위한 고민
chatGPT와의 논의 사항
질문
나는 현재 기존의 정적인 블로그 사이트를 동적인 웹 어플리케이션 사이트로 구축하고 싶어.
기존의 파일들은 다음 내가 올린 파일 처럼 구조가 짜여져 있으며, 기존 데이터를 SQLite 데이터베이스에 입력을 시켜야 하는 상황이라서,
먼저 기존 데이터를 마이그레이션 시키는 기능을 어떤 식으로든 구현해야 하는 상황이야. 가장 편리한 방법으로 스크립트나 프로그램을 짜줘.
기존 문서에서 새로운 양식으로 변환하는 방법은 다음과 같아.
내가 지정한 디렉토리에서, md 파일들을 하위 디렉토리까지 전부 찾아서 탐색을 해야하고, 각 파일은 자기 자신이 있는 위치 기준, src 라는 폴더 안에 자기 문서 안에 쓰인 이미지가 들어있어.
이미지 링크를 발견하면, 이미지를 탐색 한뒤 이미지 사본을 내가 지정한 디렉토리로 옮길 수 있어야 해.
더불어 문서 앞에는 properties 가 존재 하는데 포팅을 위한 데이터 구조는 다음과 같아.(필요한 것과 필요하지 않은 것이 있어.) 하위의 내용을 기준으로 데이터를 파싱해서 마이그레이션이 필요해.
<head>
- emoji(필수)
- title
- date
- tag
- categories( 띄워쓰기로 파싱)
여기서 기록하지 않은 md 파일 내의 properties는 무시해
<body>
- body number : 자동 생성, 문단 시작을 0으로 시작해 증가해 나감
- body : 한 문단만을 저자해. head와 같은 것들도 한줄이라면 한 문단 취급해. 이미지도 동일. 이미지를 발견한 경우, 이미지로 따로 저장해야해. 코드블록의 경우 코드 블록이 끝나는 부분까지 한꺼번에 문단으로 취급해야함.
- createdAt: 최초 생성 일자 (기본적으로 해당 스크립트로 데이터 마이그레이션 하는 순간의 시간을 기록해둬)
- modifiedAt: 갱신 일자(이 마이그레이션 스크립트에선 createdAt과 동일하게 지정해주면됨)
- type : 이미지 링크, 코드블록, 문자열 세가지로 구분해.
body는 위의 2번의 내용을 기준으로 한 문단으로 취급되는 형태에 따라서 데이터 한 개 가 생성된다고 생각하면 되.
이걸 기반으로 만들어서 보여줘
ChatGPT 답변
정적인 블로그 사이트를 동적인 웹 애플리케이션으로 전환하기 위해, 주어진 마이그레이션 요구 사항을 충족하는 파이썬 스크립트를 작성해드리겠습니다. 이 스크립트는 마크다운 파일을 SQLite 데이터베이스로 마이그레이션하고, 이미지 파일을 적절한 디렉토리로 이동시키는 작업을 수행합니다.
스크립트 설명
- 마크다운 파일 탐색: 지정한 디렉토리 내의 모든 마크다운 파일을 재귀적으로 탐색합니다.
- 이미지 파일 이동: 각 마크다운 파일에서 이미지 링크를 찾아 지정한 디렉토리로 이미지를 이동합니다.
- 데이터 파싱: 마크다운 파일의 헤더와 본문을 파싱하여 필요한 속성만 추출합니다.
- 데이터베이스 저장: 파싱한 데이터를 SQLite 데이터베이스에 저장합니다.
필수 라이브러리
markdown2
sqlite3
os
shutil
re
datetime
이제 스크립트를 작성하겠습니다.
import os
import re
import sqlite3
import shutil
from datetime import datetime
import markdown2
# 경로 설정
source_directory = '/path/to/source_directory'
destination_directory = '/path/to/destination_directory'
database_path = '/path/to/database.db'
# 데이터베이스 연결 및 테이블 생성
conn = sqlite3.connect(database_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
emoji TEXT,
title TEXT,
date TEXT,
tags TEXT,
categories TEXT,
body_number INTEGER,
body TEXT,
createdAt TEXT,
modifiedAt TEXT,
type TEXT
)
''')
conn.commit()
def parse_markdown(file_path):
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read()
# 헤더 파싱
header_pattern = re.compile(r'^<head>(.*?)</head>', re.DOTALL)
header_match = header_pattern.search(content)
header_content = header_match.group(1) if header_match else ''
header = {}
for line in header_content.split('\n'):
key_value = line.split(':')
if len(key_value) == 2:
key, value = key_value
header[key.strip()] = value.strip()
# 본문 파싱
body_content = content[header_match.end():].strip() if header_match else content.strip()
body_parts = []
body_number = 0
for block in re.split(r'\n\s*\n', body_content):
if block.strip():
block_type = 'string'
if block.startswith('!['):
block_type = 'image'
elif block.startswith('```') and block.endswith('```'):
block_type = 'code'
body_parts.append((body_number, block, block_type))
body_number += 1
# 이미지 처리
image_links = re.findall(r'!\[.*?\]\((.*?)\)', body_content)
for link in image_links:
image_source_path = os.path.join(os.path.dirname(file_path), 'src', link)
image_destination_path = os.path.join(destination_directory, 'images', link)
os.makedirs(os.path.dirname(image_destination_path), exist_ok=True)
shutil.copy2(image_source_path, image_destination_path)
return header, body_parts
def migrate_files(source_directory):
for root, dirs, files in os.walk(source_directory):
for file in files:
if file.endswith('.md'):
file_path = os.path.join(root, file)
header, body_parts = parse_markdown(file_path)
emoji = header.get('emoji', '')
title = header.get('title', '')
date = header.get('date', '')
tags = header.get('tag', '')
categories = header.get('categories', '').replace(' ', ',')
createdAt = datetime.now().isoformat()
modifiedAt = createdAt
for body_number, body, body_type in body_parts:
cursor.execute('''
INSERT INTO posts (emoji, title, date, tags, categories, body_number, body, createdAt, modifiedAt, type)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
''', (emoji, title, date, tags, categories, body_number, body, createdAt, modifiedAt, body_type))
conn.commit()
migrate_files(source_directory)
conn.close()
스크립트 사용 방법
- 경로 설정:
source_directory
,destination_directory
,database_path
를 적절한 경로로 설정합니다. - 라이브러리 설치: 필요한 라이브러리를 설치합니다.
pip install markdown2
- 스크립트 실행: 스크립트를 실행하여 데이터 마이그레이션을 수행합니다.
이 스크립트는 주어진 요구 사항에 맞춰 마크다운 파일을 파싱하고, 데이터를 SQLite 데이터베이스에 저장하며, 이미지 파일을 지정된 디렉토리로 이동합니다.
현재 상황 정리
- ChatGPT 이자식 의도를 완벽하게 이해 못함 허허..
- 파일 구조 분석 안한듯…
- 기본적으로 나온 내용을 기반으로 어떻게 설정할지 고려해서 짜 봐야 할 것으로 보인다.