AgentSkillsCN

Run Migration

运行迁移

SKILL.md

Run Migration

모델 변경 시 Alembic 마이그레이션을 생성하고 적용합니다.

사용 시점

Phase 4 (코드 생성) 내부에서 모델 생성/수정 직후 자동 호출됩니다.

code
모델 생성/수정
    ↓
run-migration (이 스킬)
    ↓
테스트 실행

워크플로우

Step 1: 변경 감지

bash
uv run alembic check
  • 출력이 없으면 → 변경 없음, 종료
  • "FAILED" 출력 → 마이그레이션 필요

Step 2: 마이그레이션 파일 생성

bash
uv run alembic revision --autogenerate -m "변경 설명"

메시지 컨벤션:

  • 새 모델: add {model_name} table
  • 컬럼 추가: add {column} to {table}
  • 컬럼 수정: alter {column} in {table}
  • 컬럼 삭제: drop {column} from {table}

Step 3: 생성된 파일 검토

migrations/versions/ 디렉토리에서 새로 생성된 파일 확인:

python
def upgrade() -> None:
    # 예상되는 변경 확인
    op.create_table(...)
    op.add_column(...)

def downgrade() -> None:
    # 롤백 로직 확인
    op.drop_column(...)
    op.drop_table(...)

검토 포인트:

  • upgrade()가 의도한 변경만 포함하는지
  • downgrade()가 올바르게 롤백하는지
  • 불필요한 변경이 포함되지 않았는지

Step 4: 마이그레이션 적용

bash
uv run alembic upgrade head

Step 5: 검증

bash
# 현재 상태 확인
uv run alembic current

# 히스토리 확인
uv run alembic history --verbose

자주 사용하는 명령어

명령어설명
uv run alembic check변경 감지
uv run alembic revision --autogenerate -m "msg"마이그레이션 생성
uv run alembic upgrade head최신으로 적용
uv run alembic downgrade -1한 단계 롤백
uv run alembic current현재 버전 확인
uv run alembic history히스토리 확인

주의사항

SQLite 제한

SQLite는 일부 ALTER 작업을 지원하지 않습니다:

python
# 지원 안 됨
op.alter_column(...)  # 컬럼 타입 변경
op.drop_column(...)   # 컬럼 삭제 (batch mode 필요)

# 해결: batch mode 사용
with op.batch_alter_table('users') as batch_op:
    batch_op.drop_column('old_column')

데이터 마이그레이션

스키마 변경 외에 데이터 변환이 필요한 경우:

python
def upgrade() -> None:
    # 1. 새 컬럼 추가 (nullable)
    op.add_column('users', sa.Column('full_name', sa.String()))

    # 2. 데이터 마이그레이션
    connection = op.get_bind()
    connection.execute(
        sa.text("UPDATE users SET full_name = first_name || ' ' || last_name")
    )

    # 3. NOT NULL 적용
    op.alter_column('users', 'full_name', nullable=False)

env.py 모델 등록

새 모델을 추가할 때 migrations/env.py에 import 추가 필수:

python
# migrations/env.py
from src.modules.{domain}.models import {Model}  # noqa: F401

autogenerate가 모델을 인식하려면 반드시 import되어야 합니다.

에러 처리

"Target database is not up to date"

bash
# 먼저 현재 상태로 업그레이드
uv run alembic upgrade head

# 그 다음 새 마이그레이션 생성
uv run alembic revision --autogenerate -m "msg"

"Can't locate revision"

bash
# 마이그레이션 히스토리 초기화 (개발 환경만)
rm -rf migrations/versions/*
uv run alembic revision --autogenerate -m "initial"
uv run alembic upgrade head