Django같은 경우 풀스택을 지향하는 프레임워크로써 기본적으로 수많은 기능들을 제공한다. 그 중 편리한 기능중 하나가 바로 마이그레이션이다. 프레임워크에서 기본적으로 마이그레이션 기능을 제공하기에 사용자는 추가적인 설치나 세팅을 해줄필요가 없이 손쉽게 정의한 모델을 데이터베이스 테이블로 생성할 수 있다.
하지만 Flask, Sanic등 자유도가 높은 프레임워크의 경우 마이그레이션을 위한 기본 기능이 존재하지 않는다. 일반적으로 Alembic을 통해 마이그레이션 관리를 통합하는데, 본 포스팅에서는 SQLAlchemy를 사용하는경우에 Alembic을 통해 데이터베이스 마이그레이션을 관리하는 방법에 대해 기술한다.
1. 설치
아래의 명령어로 라이브러리를 설치한다.
pip3 install alembic
2. 초기화
아래의 명령어로 alembic을 초기화한다.
alembic init 폴더명
폴더명은 원하는 이름으로 지정할 수 있다. 나같은 경우 대부분 migrations
라고 지정한다. 위 명령어를 실행하면 지정한 폴더명으로 마이그레이션 관리 폴더가 생성된다.
3. 기본 설정
우리가 생성한 모델 파일을 Alembic에서 자동으로 참조하여 revision을 생성하려면 간단한 설정이 필요하다. 먼저 2번에서 초기화를 진행한 이후 생성된 폴더로 들어가보면 env.py
라는 파일이 하나 존재한다. 해당 파일을 열어준다.
- 최상단에
import os
,import sys
를 추가해준다. - 5번 라인에 존재하는
from sqlalchemy import engine_from_config
를from sqlalchemy import create_engine
로 수정한다. - 아래의 라인들을 import문 이후 최상단에 추가한다.
parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) sys.path.append(parent_dir)
- 아래의 라인을
config = context.config
아래 라인에 추가한다.fileConfig(config.config_file_name) sys.path.insert(0, os.path.dirname( os.path.dirname(os.path.realpath(__file__))))
- 아래의 라인을
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
run_migrations_offline()
함수url = config.get_main_option("sqlalchemy.url")
아래에 존재하는context.configure
에서 url을mysql+pymysql://flask:flask@localhost:3306/flask
처럼 자신의 DB접속 주소로 수정해준다.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
위 명령어를 입력하면 실제 데이터베이스의 테이블로 적용이 완료된다.
'Coding > Python' 카테고리의 다른 글
Python aiohttp Mocking 하는 방법 (0) | 2019.10.30 |
---|---|
Django Middleware로 특정 주소 Redirect 시키는 방법 (0) | 2019.10.21 |
Django Restframework Serializer 뜯어보기 (0) | 2019.09.19 |
Python dataclass property/setter (0) | 2019.09.18 |
Python Requests Retry (0) | 2019.09.05 |