Alembic 데이터베이스 마이그레이션 도구

snooby·2022년 8월 19일
2

⚒ Python

목록 보기
8/14
post-thumbnail

서비스를 운영하려면 데이터베이스 스키마를 관리할 수 있는 마이그레이션이 필요해집니다.
백엔드로 가장 많이 쓰이는 툴이 Node.js입니다. 물론 Node.js로도 데이터 베이스 마이그레이션을 할 순 있지만 약하다고 합니다.

Alembic

Alembic은 SQLAlechemy 기반의 마이그레이션 도구로 Python과 함께 사용할 수도 있고, 별도로도 사용할 수 있습니다.

Alembic 사용하기

Alembic을 사용하기 위해서는 설치가 필요하다

pip install alembic

설치 후 초기화 명령어를 통해 초기화를 진행합니다.

alembic init myproject

초기화를 진행하고 나면 다음과 같이 파일들이 생성됩니다.

alembic.ini

alembic.ini 이 데이터베이스 설정 파일입니다.
alembic.ini는 alembic 폴더 상위에 존재합니다.

이 파일 내 sqlalchemy.url = 부분에 우리가 연결하고자 하는 db url을 정의해 데이터베이스를 지정합니다.

마이그레이션 관리

alembic은 리비전을 사용해 데이터베이스 스키마를 관리합니다.
alembic/versions 안에 있는 .py 파일에 정의된 대로 마이그레이션이 진행됩니다.

"""init

Revision ID: 7df76e13d094
Revises: 
Create Date: 2022-08-11 17:17:30.493321

"""
from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision = '7df76e13d094'
down_revision = None
branch_labels = None
depends_on = None


def upgrade():
    pass


def downgrade():
    pass

기본적으로 이렇게 생겼는데

upgrade()

upgrade()는 마이그레이션 버전을 적용할 때 실행되고, downgrade()는 적용한 마이그레이션을 취소할 때 실행됩니다.
처음 기본은 pass 여서 아무것도 적용이 안되는데 이제 테이블 추가나 칼럼변경을 원할경우 코드를 작성하면 됩니다.

def upgrade():
   # 테이블 생성
   op.create_table(
       'jobs',
       sa.Column('id', sa.Integer, primary_key=True),
       sa.Column('title', sa.String, nullable=False),
       sa.Column('description', sa.String, nullable=False)
   )


def downgrade():
   # 테이블 삭제
   op.drop_table('jobs')

alembic이 SQLAlchemy를 사용하므로 sa 객체를 이용해서 마이그레이션 코드를 작성할 수 있습니다.
이 방법이 아니라 sql을 사용하고자 한다면 op.execute()를 사용하시면됩니다.
SQLAlchemy에 익숙하지 않다면 op.execute()를 사용하는 것도 방법일 듯 합니다.

def upgrade():
   op.execute("""
       CREATE TABLE IF NOT EXISTS users (
           id INTEGER PRIMARY KEY,
           name VARCHAR(50) NOT NULL
       )
   """)

def downgrade():
   op.execute("""
       DROP TABLE users
   """)

이렇게 작성한 코드를 적용시키려면 아래 코드를 실행하면됩니다.

alembic upgrade head

위 명령어를 진행하면 upgrade() 함수에 정의된 동작이 진행되게 됩니다.

버전 관리

새로운 버전을 생성해서 버전관리 마이그레이션을 작성하고 싶을 경우 revision을 이용해서 추가로 .py파일을 생성해줍니다.

alembic revision -m "message" # 메시지 추가 
alembic revision

# alembic에서 metadata 변화를 자동적으로 감지해 revision을 작성해줌
alembic revision --autogenerate
alembic revision --autogenerate -m "message"


새로운 버전의 .py파일이 생성됩니다.

env.py

--autogenerate 을 사용해 자동으로 revision을 작성하기 위해서는 env.py을 먼저 세팅해줘야합니다.
'env.py' 파일 수정을 통해서 데이터베이스의 접속 정보를 관리합니다.
alembic migration tool이 적용될 때 실행되는 python script이다.


이렇게 만들고자 하는 테이블 정보를 models.py에 작성한 후

env.py에 우리가 정의한 models.py의 테이블과 db를 연결해줄 Base 세션정보의 metadata를 가져와 target_metadata로 지정해줍니다.

그리고 alembic revision --autogenerate -m "user" 를 실행하면

다음처럼 새로운 revision 파일이 생깁니다.


이 전에 없었던 table 정보 코드가 자동생성되어있습니다.
down_revision에는 이전 버전의 버전정보가 기록되어있습니다.

이제 이렇게 생성된 버전 마이그레이션 소스를 실행시키면 새로운 또는 변경된 table 정보가 적용됩니다.

alembic upgrade head

profile
데이터를 가치있게 다루고 싶은 개발자 🐥

0개의 댓글