AlembicでPythonのプロジェクトにデータベースマイグレーションを追加する


Alembicとは?

Alembicは、Pythonのデータベースマイグレーションのフレームワークです。データベースのスキーマやデータのバージョン管理を行い、新しいバージョンへの移行を容易にします。

この記事では、PythonのプロジェクトにAlembicを追加してデータベースに対するマイグレーションを実施してみます。またPythonのプロジェクトはPipenvによるパッケージ管理が行われている事を想定しています。

インストール

pipenv install alembic

Alembicをインストールします。

マイグレーション環境の作成

Alembicをインストールしたら、マイグレーション環境の作成を行います。
下記のコマンドを実行します。

alembic init alembic

コマンドを実行すると下記のようにalembic.iniという設定ファイルと、alembicディレクトリが生成されます。

./
├── Pipfile
├── Pipfile.lock
├── alembic
│   ├── README
│   ├── env.py
│   ├── script.py.mako
│   └── versions
└── alembic.ini

alembic.iniの設定ファイルではデータベースの接続先などを指定します。
またalembicディレクトリのversionsディレクトリにはマイグレーションスクリプトが格納されます。

今回はローカル環境で稼働しているMySQLを想定してデータベースの接続先を指定してみます。alembic.iniを開き、下記の行を探します。

sqlalchemy.url = driver://user:pass@localhost/dbname

MySQLの場合は下記のように指定します。

sqlalchemy.url = mysql+pymysql://root:@localhost/dbname

上記で指定したデータベースが既に作成されている必要があります。
これでマイグレーションを行う準備が整いました。

テーブルの作成

データベースに対してテーブルを作成するマイグレーションを作成してみます。

マイグレーションスクリプトの作成は下記のコマンドで行います。

alembic revision -m "create posts table"

このコマンドを実行すると、先ほど作成されたversionsディレクトリにファイルが追加されます。

このマイグレーションスクリプトにテーブル作成指示を定義していきます。
スクリプトにあるupgrade, downgradeを下記のようにしました。

def upgrade() -> None:
    op.create_table(
        'posts',
        sa.Column('title', sa.String(255)),
        sa.Column('description', sa.String(255))
    )
    pass
def downgrade() -> None:
    op.drop_table('posts')
    pass

upgradeにはpostsテーブルを作成する定義を、downgradeにはpostsテーブルを削除する定義がされています。

それではマイグレーションを実行してみます。
マイグレーションに実行は下記のコマンドで行います。

alembic upgrade head

テーブルが作成されたかどうかを確認してみます。

titleとdescriptionカラムを持つpostsテーブルが作成された事が確認出来ました。

作成されたpostsテーブル

また下記のコマンドはダウングレードを行うコマンドで作成したpostsテーブルが削除されることを確認できます。

alembic downgrade base