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は導入済みの前提で進めます。
HackATAは、エンジニアを目指す方のためのプログラミング学習コーチングサービスです。 経験豊富な現役エンジニアがあなたの学習をサポートします。
✓ 質問し放題
✓ β版公開中(2025年内の特別割引)
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を使いこなして、適切なデータベース管理をしていきましょう。