🤖

【Alembic】マイグレーションファイルの作成と更新について

に公開

バージョン確認

マイグレーションの履歴を表示する

$ alembic history
dn8gzx3n9vdj -> ns1qzx2q1szv (head), add columns in members table
<base> -> dn8gzx3n9vdj, create members table

現在のマイグレーションバージョンを確認する

$ alembic current
ns1qzx2q1szv (head)

マイグレーションファイルの作成

  1. 現在のマイグレーションバージョンが (head) であることを確認する
    $ alembic current
    ns1qzx2q1szv (head)
    
  2. マイグレーションファイルを生成する
    $ alembic revision --autogenerate -m "コメント"
    
  3. 作成されたマイグレーションファイルを編集する
  4. マイグレーションファイルを反映する
    $ alembic upgrade head
    
  5. マイグレーションが適用されたことを確認する
    $ alembic current
    727fb7080676 (head)
    

マイグレーションファイルの編集

alembic revision --autogenerate で生成された内容は、そのまま利用できる場合もあるが、制約やコメント、初期データ投入などを追加するために手動で編集することも多い。

テーブルの新規作成

"""create members table

Revision ID: dn8gzx3n9vdj
Revises: 
Create Date: 2025-08-29 11:00:00.000000

"""

from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision: str = "dn8gzx3n9vdj"
down_revision: Union[str, None] = None
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(
        "members",
        sa.Column("id", sa.String(), primary_key=True, nullable=False),
        sa.Column("name", sa.String(), nullable=False),
        sa.Column("created_at", sa.DateTime(), nullable=False),
        sa.Column("updated_at", sa.DateTime(), nullable=False),
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    op.drop_table("members")

カラム追加

"""add columns in members table

Revision ID: ns1qzx2q1szv
Revises: dn8gzx3n9vdj
Create Date: 2025-08-29 12:00:00.000000

"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa

# revision identifiers, used by Alembic.
revision: str = 'ns1qzx2q1szv'
down_revision: Union[str, None] = 'dn8gzx3n9vdj'
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.add_column(
        "members",
        sa.Column("birthday", sa.Date(), nullable=True),
    )
    op.add_column(
        "members",
        sa.Column("gender", sa.Integer(), nullable=True), # 0: male, 1: female, 2: other
    )
    # ### end Alembic commands ###


def downgrade() -> None:
    # ### commands auto generated by Alembic - please adjust! ###
    op.drop_column("members", "gender")
    op.drop_column("members", "birthday")
    # ### end Alembic commands ###

マイグレーションのロールバック

注意事項

  • 既に本番環境や共有環境へ適用済みのマイグレーションは編集しない
  • 適用済みマイグレーションの変更が必要な場合は、新しいマイグレーションファイルを作成する
  • downgrade で戻して編集する運用は、ローカル開発中のマイグレーションを修正する場合に利用する

作業イメージ

  • ロールバック前の状態

    base -> dn8gzx3n9vdj -> ns1qzx2q1szv -> 727fb7080676 -> c9fe0b0f1382 -> 2f0490122257(head)
    
  • ロールバック後

    base -> dn8gzx3n9vdj -> ns1qzx2q1szv (current)
                                ↑ ココまで戻す
    
    727fb7080676 -> c9fe0b0f1382 -> 2f0490122257(head)
      ↑ この3つが未適用になる
    
  • 再適用後

    base -> dn8gzx3n9vdj -> ns1qzx2q1szv -> 727fb7080676 -> c9fe0b0f1382 -> 2f0490122257(head)
    

手順

  1. ロールバックするマイグレーションの revision_id を確認する
    $ alembic history
    c9fe0b0f1382 -> 2f0490122257 (head), create fields table
    727fb7080676 -> c9fe0b0f1382, create games table
    ns1qzx2q1szv -> 727fb7080676, create teams table
    dn8gzx3n9vdj -> ns1qzx2q1szv, add columns in members table
    <base> -> dn8gzx3n9vdj, create members table
    
  2. 指定した revision_id の状態までロールバックする
    $ alembic downgrade ns1qzx2q1szv
    
  3. マイグレーションがロールバックされたことを確認する
    $ alembic current
    ns1qzx2q1szv
    
  4. マイグレーションファイルを編集する
  5. マイグレーションファイルを反映する
    $ alembic upgrade head
    
  6. マイグレーションが再適用されたことを確認する
    $ alembic current
    2f0490122257 (head)
    
ヘッドウォータース

Discussion