AI는 변환 규칙이 기계적이기 때문에 포맷 변환(CSV ↔ JSON ↔ SQL)과 마이그레이션 스크립트에 잘 맞습니다. 비결은 정확하고 안전하도록 충분한 맥락을 주는 것입니다: schema, 샘플 row, 그리고 명시적인 안전 요구사항.
AI는 변환 규칙이 기계적이기 때문에 포맷 변환(CSV ↔ JSON ↔ SQL)과 마이그레이션 스크립트에 잘 맞습니다. 비결은 정확하고 안전하도록 충분한 맥락을 주는 것입니다: schema, 샘플 row, 그리고 명시적인 안전 요구사항.
import csv
# 소스 CSV: id,email,signup_date (signup_date는 비어 있을 수 있음)
# 타깃 테이블: users(id INT, email TEXT NOT NULL, signup_date DATE NULL)
def csv_to_sql(path: str) -> list[str]:
statements = []
with open(path, newline="", encoding="utf-8") as f:
for row in csv.DictReader(f):
email = row["email"].strip()
if not email: # validate: 잘못된 row는 건너뛰고 쓰레기를 insert하지 않음
continue
date = row["signup_date"].strip() or None
email_sql = email.replace("'", "''") # 따옴표 escape로 깨진 SQL / injection 방지
date_sql = f"'{date}'" if date else "NULL"
# ON CONFLICT로 idempotent하게: 재실행해도 중복을 만들지 않음
statements.append(
f"INSERT INTO users (id, email, signup_date) "
f"VALUES ({int(row['id'])}, '{email_sql}', {date_sql}) "
f"ON CONFLICT (id) DO NOTHING;"
)
return statements
주석은 중요한 부분을 표시합니다: validation(빈 email 건너뛰기), escaping(따옴표), idempotency(ON CONFLICT DO NOTHING). AI에 세 가지를 모두 포함하도록 요청하세요 — 순진한 스크립트가 잊어버리는 것들입니다.
데이터 마이그레이션은 위험이 크고 종종 일회성입니다: 이중 insert하거나 row를 누락하는 스크립트는 되돌리기 비쌀 수 있습니다. AI는 변환 작성을 가속하지만, 안전 속성 — idempotency, validation, 사본에서의 dry-run — 은 타협 대상이 아닙니다. 생성된 스크립트를 반드시 읽고 테스트해야 할 초안으로 다루고, 실제 데이터에 맹목적으로 실행할 것으로 절대 여기지 마세요.