Database
[Alembic] Auto Generating Migrations
whdvlf94
2024. 2. 19. 00:58
autogenerate 란?
Alembic에서 제공하는 autogenerate 옵션은 SQLAlchemy의 ORM을 이용하여 정의한 메타데이터를 읽어 변경된 모델과 현재 데이터베이스 스키마를 비교하여 자동으로 마이그레이션 스크립트를 생성 해주는 옵션이다.
autogenerate 옵션을 사용하기 위해서는 실제 데이터베이스 스키마를 선언한 모델로 부터 Base를 호출하여 target_metadata 변수에 설정해주어야 한다(초기값은 None).
# alembic/env.py
# add your model's MetaData object here
# for 'autogenerate' support
from myapp import mymodel
target_metadata = mymodel.Base.metadata
기존에 존재하던 account 테이블의 컬럼의 변동이 생겼고, memos라는 새로운 테이블이 생겼다고 가정 해보자.
AS-IS
class Account(Base):
__tablename__ = 'account'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
description = Column(String(200), nullable=False)
TO-BE
class Account(Base):
__tablename__ = 'account'
id = Column(Integer, primary_key=True)
name = Column(String(50), nullable=False)
class Memo(Base):
__tablename__ = 'memos'
id = Column(String(120), primary_key=True)
autogenerate 옵션을 통해 변경된 모델과 현재 데이터베이스 스키마의 데이터를 비교하여 다음과 같은 마이그레이션 스크립트가 생성된 것을 확인할 수 있다.
$ alembic revision --autogenerate -m "Initialize memos"
"""Initialize memos
Revision ID: 5376b9bd4c51
Revises: 3b685cf3d267
Create Date: 2024-02-19 00:31:39.430193
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision: str = '5376b9bd4c51'
down_revision: Union[str, None] = '3b685cf3d267'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('memos',
sa.Column('id', sa.String(length=120), nullable=False),
sa.PrimaryKeyConstraint('id')
)
op.drop_column('account', 'description')
# ### end Alembic commands ###
def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('account', sa.Column('description', sa.VARCHAR(length=200), nullable=True))
op.drop_table('memos')
# ### end Alembic commands ###