서비스를 운영하려면 데이터베이스 스키마를 관리할 수 있는 마이그레이션이 필요해집니다.
백엔드로 가장 많이 쓰이는 툴이 Node.js입니다. 물론 Node.js로도 데이터 베이스 마이그레이션을 할 순 있지만 약하다고 합니다.
Alembic은 SQLAlechemy 기반의 마이그레이션 도구로 Python과 함께 사용할 수도 있고, 별도로도 사용할 수 있습니다.
Alembic을 사용하기 위해서는 설치가 필요하다
pip install alembic
설치 후 초기화 명령어를 통해 초기화를 진행합니다.
alembic init myproject
초기화를 진행하고 나면 다음과 같이 파일들이 생성됩니다.
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()는 마이그레이션 버전을 적용할 때 실행되고, 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파일이 생성됩니다.
--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