Alembic database migration tool

개발자 강세영·2022년 8월 21일
0

Fastapi

목록 보기
1/1

Alembic이란

파이썬 ORM 중 제일 유명한 SQLAlchemy와 함께 쓸 수 있는 DB 마이그레이션 툴이다.
SQLAlchemy는 Django ORM과는 다르게 마이그레이션 기능을 따로 지원하지 않는 것 같고 Alembic을 마이그레이션 용도로 많이 쓰는 듯 하다.
마이그레이션 툴이 없어도 SQLAlchemy 만으로 테이블 생성이나 수정 등을 할 수는 있지만 스키마 관리나 마이그레이션별 버전관리 등을 위해선 Alembic을 활용하는게 여러모로 편리하고 유용할 것 같다.

패키지 설치

pip install alembic

Alembic 환경 생성 명령어

프로젝트 폴더에서 다음과 같이 입력하면 입력한 이름대로 하위 폴더가 생성되고 그 안에 alembic 마이그레이션 관련 기본 파일들과 프로젝트 폴더에 alembic.ini 파일이 생성된다.

alembic init <폴더 이름>
폴더 이름은 migrations 같은 이름이 무난하다

프로젝트 루트 폴더에는 alembic.ini 파일이 생성되고 alembic 폴더에는 env.py 파일이 생성되는데 둘다 환경설정 관련 파일들이다. 이 두 파일을 적절히 수정해줘서 DB연결이 정상적으로 되고, 테이블 속성을 정의하는 메타데이터 연결이 된 상태라면 마이그레이션 과정을 시작할 수 있다.

Alembic 마이그레이션 파일 생성 명령어

alembic revision -m "create account table"
alembic revision --autogenerate -m "create account table" #autogenerate 옵션 사용할 경우

Django에 비교하자면 makemigrations와 비슷한 명령어이며 autogenerate 옵션은 잘 활용하면 편리하다.
이 명령어를 입력하면 위에서 생성한 alembic 관리폴더에 마이그레이션 관련 파일이 생성된다
Django와 다른점은 수정사항이 없어도 내용없이 pass하는 마이그레이션 파일을 생성한다.
이 파일 때문에 실제로 수정을 했지만 마이그레이션 파일을 제대로 생성하지 않을 때가 있는데 upgrade head를 해서 최근 마이그레이션 실행을 시켜야 다음 revision 때 변경사항을 제대로 적용한다.

Alembic 마이그레이션 실행

alembic upgrade head #head는 가장 최근에 생성한 마이그레이션 파일대로 실행한다는 의미

Django의 migrate와 비슷하게 실제로 마이그레이션을 실행하는 명령어이다
앞서 생성된 마이그레이션 파일의 내용대로 DB에서 테이블 생성이나 수정 등의 작업이 실제로 실행된다.

autogenerate로 컬럼 속성값 변경 적용하기

  • 컬럼 속성값을 integer에서 string으로 바꿔봤는데 autogenerate 마이그레이션이 되지 않았다. 아마 이런 경우엔 autogenerate로는 변경사항을 적용하지 않는 것 같다.
  • 이 경우 env.py에 있는 이 context.configure 안에 옵션으로 compare_type=True 옵션을 넣어주면 적용된다.
with connectable.connect() as connection:
        context.configure(
            connection=connection, target_metadata=target_metadata, compare_type=True
        )

metadata 정의

autogenerate 옵션을 이용하려면 alembic 마이그레이션 폴더의 env.py에서 target_metadata 설정을 해줘야한다.

metadata = sqlalchemy.MetaData()
from models import metadata
user = Table('user', metadata)

위와 같이 sqlalchemy의 Table 객체에서 metadata 옵션을 넣어서 메타데이터를 정의하는 방법과

from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
metadata = Base.metadata

위와 같이 declarative_base()를 이용하는 방법도 가능하다. 나는 Base모델 상속을 활용할 생각이라 두번째 방법으로 진행했다. env.py에서 metadata 정의를 임포트하고 target_metadata 설정을 해주면 된다.

Postgresql에서 Enum 컬럼 사용

DBMS를 postgresql로 정하고 Enum 컬럼이 들어간 테이블을 생성하려고 하니 PostgreSQL ENUM type requires a name. 라는 에러가 떴다. postgresql을 사용할 경우

Column(Enum("normal", "manager", "admin", name="user_type"), default="normal")

같이 Enum 괄호안에 name 옵션을 정의해줘야 된다고 한다.
그리고 나서 최근 마이그레이션 파일을 지우고 다시 마이그레이션하면 된다.

0개의 댓글