한양과학기술고등학교

에듀테크 프로젝트 대시보드

Alembic 마이그레이션

alembic autogenerate upgrade downgrade env.py

모델을 바꿀 때마다 스키마 변경 스크립트를 버전 관리합니다. create_all 은 프로토타입까지만.

1. 초기화

pip install alembic
cd /home/ubuntu/offset0xf/school
alembic init migrations

alembic.ini 와 migrations/ (env.py, versions/) 가 생성됩니다.

2. env.py 연결

# migrations/env.py
from app.config import get_settings
from app.database import Base
import app.models          # 모든 모델을 import 해야 autogenerate 가 인식

config.set_main_option("sqlalchemy.url", get_settings().database_url)
target_metadata = Base.metadata
비동기 엔진을 쓰는 경우
  • alembic init -t async migrations 로 async 템플릿 사용
  • 또는 마이그레이션용으로만 동기 URL(postgresql+psycopg://)을 따로 지정

3. 마이그레이션 생성·적용

# 모델 변경 후 자동 생성
alembic revision --autogenerate -m "add posts.published flag"

# 생성된 migrations/versions/xxxx_*.py 를 반드시 눈으로 검토

alembic upgrade head      # 최신까지 적용
alembic downgrade -1      # 한 단계 되돌리기
alembic current          # 현재 리비전
alembic history --verbose

4. autogenerate 가 놓치는 것

직접 써줘야 하는 변경
  • 컬럼 이름 변경 (삭제+추가로 인식 → 데이터 유실)
  • 제약·인덱스 이름 변경, 서버 기본값 변경
  • 데이터 이관(op.execute("UPDATE ...")), Enum 값 추가

5. 배포 흐름 (이 서버)

cd /home/ubuntu/offset0xf/school
source venv/bin/activate
git pull                       # 코드 갱신
alembic upgrade head           # 스키마 갱신
sudo systemctl restart fastapi-school

다운타임을 피하려면 '컬럼 추가는 nullable 로 먼저 → 코드 배포 → 백필 → NOT NULL' 처럼 단계를 나눕니다.

"명시적 의존성 주입은 테스트를 쉽게 만든다"