SQLAlchemy 2.0.20
alembic 1.12.0
Python 3.11.5
PythonのデータベースツールキットやORMとして使われる機会が多いSQLAlchemy
で、alembic
を使ったmigrationを行う方法を紹介します。
実は、FastAPIの開発者であるSebastián Ramírez氏(@tiangolo
)が開発しているSQLModelというORMもあります。しかしながら、まだ発展途上のため、安定感のあるSQLAlchemy
で進めていきます。
今回はalembic
メインの内容とするため、SQLAlchemy
は導入済みの前提で進めます。
pip
でインストールできます。
まずは初期化しましょう。以下のコマンドで初期化できます。
引数のmigrations
はディレクトリ名になるため、別の名称が良い場合は変えられます。
上記のようなファイルとディレクトリが作成されます。
各ファイル、ディレクトリの説明は以下です。
alembic.ini
: ログやDB設定などが記載された設定ファイルmigrations
: migration関連のファイルのディレクトリREADME
: migration関連のメモenv.py
: migrationの設定ファイルscript.py.mako
: テンプレートエンジンMako
を使ったmigrationファイルのテンプレversions
: migrationファイルが保存されるディレクトリデータベースへの接続はalembic.ini
ファイルを編集します。
sqlalchemy.url
という項目があるので、その部分を書き換えます。今回はMySQLにつなぐため、MySQLへの接続情報を記載します。
しかし注意点として、MySQLの接続情報を直接コードへ書いてしまうことは避けるべきなので、env.py
へmigration実行時に使える変数として設定します。
config.set_main_option('sqlalchemy.url', "接続情報")
のようにすることで、sqlalchemy.url
が上書きされた状態で実行できます。
.env
ファイルを作成し、以下のようにデータベース接続情報を記載しましょう。
こうしておくことで、alembic.ini
のsqlalchemy.url
は必要なくなるため、コメントアウトしてしまいましょう。
alembic.ini
にコメントアウトされたfile_template
という項目があるので、コメントを外しておきましょう。
ここから、実際にmigration対象となるモデルを作っていきます。以下のようなディレクトリ構成で進めます。
まずはベースとなるbase.py
を作成します。
実際はclass Base(DeclarativeBase)
で事足りますが、Mix-in(共通で使い回す定義)を定義しておくと便利です。
続いて、users.py
も作りましょう。
シンプルなユーザー情報テーブルの定義です。
後でmodels
をimportしたときに便利なように__init__.py
も忘れずに書きましょう。
ここまでできたら、env.py
のtarget_metadata
を編集します。
以下のコマンドでmigrationファイルを作成しましょう。
すると、migrations/versions
にmigrationファイルが生成されます。
以下のコマンドでこれを適用します。
上記のように表示されたら、users
テーブルがMySQLのデータベース上に作成されたことがわかります。
作成されたテーブルに追加したいカラムがある前提とします。行を追加する方法も見ておきましょう。
先ほどのsrc/models/users.py
を編集します。今回はavatar
(ユーザーの画像URL)を格納するカラムを追加します。
追加した行はemail
とpassword
の間に挟み込みます。
alembic revision
を実行しましょう。
上記の結果にDetected added column 'users.avatar'
と書いてあるのがわかります。「users.avatar
が追加されたことを検知した」という意味です。
しかし、ここで注意です。作成されたmigrationファイルを見てみましょう。
alembic
にはbatch
(一群の意味)モードというまとめて実行するモードがあります。そのモードに含まれるadd_column
にはinsert_after
という順序を制御するオプションがあるので、それを使いましょう。(なぜ通常のadd_column
にないのか不明)
migrationファイルを編集します。
ここでMySQLを見てみると、きちんとemail
の後にavatar
があることを確認できます。
なお、以下のコマンドで実行履歴を見ることが可能です。(表示される乱数はバージョンです)
ここまで見てきた通り、alembic
は独自のコマンドがあり設定項目も多く、覚えるのに苦労します。高機能ゆえのデメリットとも言えます。
しかし、「こういうことしたいんだけど」といった要望に応えられる高品質さのために、多くのプロジェクトで採用されています。
データベース管理はソフトウェアの品質を左右する大切なタスクです。
alembic
を使いこなして、適切なデータベース管理をしていきましょう。