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テーブルが削除されることを確認できます。
alembic downgrade base