🤖
【Alembic】マイグレーションファイルの作成と更新について
バージョン確認
マイグレーションの履歴を表示する
$ alembic history
dn8gzx3n9vdj -> ns1qzx2q1szv (head), add columns in members table
<base> -> dn8gzx3n9vdj, create members table
現在のマイグレーションバージョンを確認する
$ alembic current
ns1qzx2q1szv (head)
マイグレーションファイルの作成
- 現在のマイグレーションバージョンが
(head)であることを確認する$ alembic current ns1qzx2q1szv (head) - マイグレーションファイルを生成する
$ alembic revision --autogenerate -m "コメント" - 作成されたマイグレーションファイルを編集する
- マイグレーションファイルを反映する
$ alembic upgrade head - マイグレーションが適用されたことを確認する
$ 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)
手順
- ロールバックするマイグレーションの
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 - 指定した
revision_idの状態までロールバックする$ alembic downgrade ns1qzx2q1szv - マイグレーションがロールバックされたことを確認する
$ alembic current ns1qzx2q1szv - マイグレーションファイルを編集する
- マイグレーションファイルを反映する
$ alembic upgrade head - マイグレーションが再適用されたことを確認する
$ alembic current 2f0490122257 (head)
Discussion