프로그래밍/Python

Alembic으로 쉽게 DB 마이그레이션하기

Lou Park 2024. 12. 26. 14:24

Alembic 도입 계기

개발하고 있는 토이 프로젝트에 (정말정말 귀찮지만-) DB를 도입했다.

최대한 기술스택을 간단하게 가져가고싶었지만 더 풍부한 기능지원을 위해 굴복했다.

 

Python ORM 라이브러리 SQLAlchemy를 도입했는데, 계속 테이블을 수정하면서 수동 마이그레이션에 한계가 있다고 느껴서 찾아보니 Alembic이라는 SQLAlchemy 사용자용 DB 마이그레이션 툴이 있더라. 회사에서 백엔드 코드를 눈팅하면서 본 마이그레이션 파일들이 이녀석이 만든것이었다.

 

사용하기도 간편해서 다음번에 또 쓸 것 같아 간단히 사용법을 기록하겠다.

 

시작하기

초기화

Alembic을 사용하기에 앞서, 아래 명령어로 초기화하면 설정 파일인 alembic.ini 파일과 Alembic 프로젝트가 만들어진다.

alembic init

alembic 폴더가 만들어진 모습

DB 연결 및 추가 설정

alembic.ini에서 설정할 것이 있다면 해도되고, env.py에서도 똑같이 설정할 수 있다. sqlalchemy.url에 DB URL을 연결시켜주어야하는데, 나는 개발 환경과 프로덕션 환경을 분리하기 위해 환경변수로 따로 빼두어 설정했으므로 고정된 문자열로 URL을 줄 수 없었다. 따라서 env.py에서 설정한다.

from db.model import *
from dotenv import load_dotenv

load_dotenv()

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
config.set_main_option("sqlalchemy.url", "mysql+pymysql://{user}:{password}@{host}:{port}/{database}".format(
    user=os.environ.get("MYSQL_USER"),
    password=os.environ.get("MYSQL_PASSWORD"),
    host=os.environ.get("MYSQL_ALEMBIC_HOST"),
    port=os.environ.get("MYSQL_ALEMBIC_PORT"),
    database=os.environ.get("MYSQL_DATABASE")
))

 

DB 모델 파일을을 모두 import 해주어야하며, 환경변수 값을 로드해서 sqlalchemy.url을 설정해주었다. 설정이 완료되면 버전 관리를 시작하면된다.

alembic/versions

새로운 리비전이 생성될때마다 versions 폴더에 마이그레이션 파일이 생긴다.

 

 

새로운 리비전 생성방법

alembic revision --autogenerate -m "<message>"

 

 

업그레이드 / 다운그레이드 방법

alembic upgrade head #최신 버전으로 업그레이드
alembic upgrade 1 #1개 버전만큼 업그레이드
alembic upgrade <revsion_hash> #특정 리비전으로 업그레이드 

alembic downgrade <revsion_hash> #특정 리비전으로 다운그레이드
alembic downgrade -1 #1개 버전만큼 다운그레이드