Alembic

SQLAlchemy DB 마이그레이션 도구

Alembic은 SQLAlchemy용 DB 마이그레이션 도구. 스키마 변경을 파일로 관리해서 팀원 간 DB 상태를 맞춘다. autogenerate로 변경 감지하고 upgrade/downgrade로 적용·롤백.

Database

개념

Alembic은 SQLAlchemy용 DB 마이그레이션 도구다. 스키마 변경을 파이썬 파일(리비전)로 남겨서 DB 상태를 버전 관리한다. git이 코드 변경을 추적하듯, Alembic은 DB 스키마 변경 이력을 관리한다.

왜 필요한가

스키마 변경을 수동 SQL로 관리하면 세 가지 문제가 생긴다.

  • 팀원 간 DB 상태가 달라짐 — 누구는 컬럼이 있고 누구는 없음
  • 롤백이 어려움 — "어제까지 어떤 상태였나"를 되돌리기 힘듦
  • 배포 환경과 dev가 어긋남 — 프로덕션과 로컬 스키마 동기화가 수작업

Alembic은 변경을 파일로 커밋해서 DB 상태를 git처럼 관리한다.

기본 명령어

alembic revision --autogenerate -m "설명"  # 변경 감지해서 마이그레이션 파일 생성
alembic upgrade head    # 최신으로 적용
alembic downgrade -1    # 한 단계 롤백
alembic current         # 현재 버전 확인
alembic history         # 전체 이력

마이그레이션 파일 구조

def upgrade():
    op.create_table('user',
        sa.Column('id', sa.Integer(), primary_key=True),
        sa.Column('name', sa.String(50)),
    )

def downgrade():
    op.drop_table('user')
  • upgrade() — 앞으로 적용
  • downgrade() — 되돌리기

두 함수가 대칭이 되어야 롤백이 깔끔하다.

주의할 점

  • autogenerate가 전부는 아니다 — 타입 변경, view, 일부 인덱스 변경 등은 감지 못 함. 생성 후 파일을 꼭 확인
  • 동시 브랜치 충돌 — 팀원 두 명이 각자 마이그레이션 만들면 head가 둘이 됨 → alembic merge heads로 해결
  • DB URL 분리 — 환경변수로 dev/stage/prod를 구분

데이터 마이그레이션도 가능

스키마 변경뿐 아니라 기존 데이터 변환도 같은 파일 안에서 할 수 있다.

def upgrade():
    op.add_column('user', sa.Column('full_name', sa.String()))
    op.execute("UPDATE user SET full_name = first_name || ' ' || last_name")

스키마와 데이터 변환을 한 리비전에 묶으면 "이 버전이면 데이터 모양도 이렇다"가 보장된다.

더 보기

  • Frappe-Fixture — Frappe에서는 Alembic 대신 fixture로 데이터 관리 (의도가 다름)
sunshinemoon · 2026