본문 바로가기
Coding/Python

Python Alembic으로 Migration 관리하는 방법

by Hide­ 2019. 9. 26.
반응형

Django같은 경우 풀스택을 지향하는 프레임워크로써 기본적으로 수많은 기능들을 제공한다. 그 중 편리한 기능중 하나가 바로 마이그레이션이다. 프레임워크에서 기본적으로 마이그레이션 기능을 제공하기에 사용자는 추가적인 설치나 세팅을 해줄필요가 없이 손쉽게 정의한 모델을 데이터베이스 테이블로 생성할 수 있다.

하지만 Flask, Sanic등 자유도가 높은 프레임워크의 경우 마이그레이션을 위한 기본 기능이 존재하지 않는다. 일반적으로 Alembic을 통해 마이그레이션 관리를 통합하는데, 본 포스팅에서는 SQLAlchemy를 사용하는경우에 Alembic을 통해 데이터베이스 마이그레이션을 관리하는 방법에 대해 기술한다.

1. 설치

아래의 명령어로 라이브러리를 설치한다.

pip3 install alembic

2. 초기화

아래의 명령어로 alembic을 초기화한다.

alembic init 폴더명

폴더명은 원하는 이름으로 지정할 수 있다. 나같은 경우 대부분 migrations라고 지정한다. 위 명령어를 실행하면 지정한 폴더명으로 마이그레이션 관리 폴더가 생성된다.

3. 기본 설정

우리가 생성한 모델 파일을 Alembic에서 자동으로 참조하여 revision을 생성하려면 간단한 설정이 필요하다. 먼저 2번에서 초기화를 진행한 이후 생성된 폴더로 들어가보면 env.py라는 파일이 하나 존재한다. 해당 파일을 열어준다.

  1. 최상단에 import os, import sys를 추가해준다.
  2. 5번 라인에 존재하는 from sqlalchemy import engine_from_configfrom sqlalchemy import create_engine로 수정한다.
  3. 아래의 라인들을 import문 이후 최상단에 추가한다.
    parent_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
    sys.path.append(parent_dir)
  4. 아래의 라인을 config = context.config 아래 라인에 추가한다.
    fileConfig(config.config_file_name)
    sys.path.insert(0, os.path.dirname(
     os.path.dirname(os.path.realpath(__file__))))
  5. 아래의 라인을 fileConfig(config.config_file_name) 아래에 추가한다.
    from core.databases import Base # SQLAlchemy Base변수
    from apps.posts.models import * # SQLAlchemy로 정의한 모델 파일
    from apps.users.models import * # SQLAlchemy로 정의한 모델 파일
    target_metadata = Base.metadata
  6. run_migrations_offline() 함수 url = config.get_main_option("sqlalchemy.url") 아래에 존재하는 context.configure에서 url을 mysql+pymysql://flask:flask@localhost:3306/flask 처럼 자신의 DB접속 주소로 수정해준다.
  7. run_migrations_online() 함수에 들어있는
     connectable = engine_from_config(
         config.get_section(config.config_ini_section),
         prefix="sqlalchemy.",
         poolclass=pool.NullPool,
     )
    를 아래와 같이 바꿔준다.
    connectable = create_engine(
        DB접속주소, # 6번 참고
        poolclass=pool.NullPool
    )

4. Revision 생성

아래의 명령어로 Revision을 생성한다.

alembic revision -m "원하는 메시지" --autogenerate

--autogenerate 명령어를 통해 우리가 env.py에 추가한 모델들을 자동으로 읽어들여서 Revision을 생성할 수 있도록 해준다. 이렇게 하면 /versions 폴더 아래에 임의의문자열_원하는메시지.py라는 파일이 하나 생성된다. 해당 파일로 들어가서 정상적으로 적용됐는지 확인한다.

5. Migration

4번에서 Revision파일에 이상이 없다면 아래의 명령어로 실제 데이터베이스에 Revision을 적용한다.

alembic upgrade head

위 명령어를 입력하면 실제 데이터베이스의 테이블로 적용이 완료된다.