개발로 자기계발
article thumbnail
728x90

Alembic

정의

Spring에서 Flyway가 있다면 Python(FastAPI)에서는 Alembic이 DB 마이그레이션 버전 관리를 제공한다.

SQLAlchemy를 사용할 때 경량화된 DB 마이그레이션 툴이다.

 

역할

- Scripts로 migration 환경을 생성

- Migration 테이블을 통해 어디까지 마이그레이션이 되었는지 확인

- 데이터베이스를 실시간으로 수정 및 변경 사항을 추적할 수 있다.

- 중복 마이그레이션 및 버전 관리(다운그레이드 및 롤백도 가능)

 

Alembic 명령어 및 파일 소개

Alembic 명령어
No. Command Details
1 alembic init <폴더명> 작성한 폴더명으로 alembic 정보(마이그레이션 환경)가 담길 폴더가 생성
2 alembic revision -m <메세지> 환경의 새 버전 생성(=버전 관리)
3 alembic upgrade <revison #>
alembic downgrade <revison #>
데이터베이스 버전 변경
이 명령을 통해 DB의 버전을 반영시킨다.
  alembic upgrade head

alembic downgrade base

alembic upgrade / downgrade

alembic upgrade / downgrade revisionID
가장 상단의 버전으로 DB가 upgrade

가장 하단의 버전으로 DB가 downgrade

N의 수 만큼 upgrade와 downgrade
ex) downgrade -1 => 바로 이전 버전으로

revisionID로 upgrade와 downgrade

 

Alembic 구성
No. File name information
1 Alembic Directory Alembic의 모든 환경 속성을 내포
프로젝트의 모든 버전을 내포
업그레이드를 위해 마이그레이션을 호출하는 위치
다운그레이드를 위해 마이그레이션을 호출하는 위치
2 Alembic.ini file 데이터베이스의 접속 정보 관리
Alembic이 호출 될 때 정보를 찾는 파일
3 Env.py 파일 수정을 통해서 데이터베이스의 접속 정보를 관리
Alembic이 호출될 때마다 실행되는 Python의 Scripts가 기재
SqlAIchemy의 Engine의 생성과 migration이 실행되도록 기재
4 READEM.md 어떤 환경에서 migration 환경을 작성했는지 기재
5 Script.py.mako 새로운 migration의 스크립트를 생성하기 위해 사용되는 Mako(python 템플릿 엔진) 템플릿 파일. 
여기에 기재되어 있는 무엇이든 version/내의 새로운 파일을 생성하는 데에 사용

 

실습해 보기

1) pip install alembic(alembic 설치 시 sqlalchemy도 동시에 설치된다고 한다.)

2) alembic init alembic(alembic에 필요한 모든 디렉터리를 생성)

3) Upgarde Alebic

  • alembic.ini에서 sqlalchemy.url에 PostgreSQL url을 삽입

PostgreSQL 연결

  • env.py파일 수정
import sys
sys.path.append("...")
import models
from logging.config import fileConfig

from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config
fileConfig(config.config_file_name) #구성파일이름
target_metadata = models.Base.metadata #models.py의 Base

# Interpret the config file for Python logging.
# This line sets up loggers basically.
#if config.config_file_name is not None:
#    fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
# target_metadata = None
  • 새 버전 생성
alembic revision -m "create phone number for user col"

버전을 더블 클릭하면 새 버전의 내용을 볼 수 있다.

  • Alembic을 통해 phone number 열을 생성해 보기

# 앞서 생성했던 버전의 upgrade 함수를 수정
def upgrade():
    op.add_column('users', sa.Column('phone_number', sa.String(), nullable=True))

revisionID로 upgrade
phone_number열 생성 / integer(x) string(o)

  • Alembic을 통해 phone number 열을 삭제해 보기(이전 버전으로 돌아감)
def downgrade():
    op.drop_column('users', 'phone_number')

바로 전의 version을 돌아가고 &nbsp;싶은 경우 -1를 사용한다.

 

728x90
SMALL
profile

개발로 자기계발

@김잠봉

틀린부분이나 조언이 있다면 언제든 환영입니다:-)