はじめに
最近開発しているWebアプリケーションで、データベースのスキーマ変更が必要になりました。
そのプロジェクトではPythonのFastAPIフレームワークを使っていて、データモデルの定義にはSQLModelを採用しています。
そこで、SQLModelで定義したモデルを元に、AlembicでDBマイグレーションを行う方法を調べて実践してみました。
SQLModelはPydanticとSQLAlchemyをベースに開発されたライブラリで、モデル定義とDB操作の両方に使えて便利です。
一方、Alembicは、SQLAlchemyの作者によって開発されたマイグレーションツールで、SQLAlchemyベースのプロジェクトでよく使われています。今回、SQLModelとAlembicを組み合わせでマイグレーションを行ったので、素人ながら備忘録として手順をまとめておきます。
環境設定
- Python 3.x
- SQLModel
- Alembic
- PostgreSQL(または他のRDBMS)
pipで必要なパッケージをインストールします。
pip install sqlmodel alembic psycopg2
SQLModelでモデルを定義
まず、SQLModelを使ってデータモデルを定義します。例えば、Userモデルを定義してみます。
from sqlmodel import SQLModel, Field
class User(SQLModel, table=True):
id: int = Field(primary_key=True)
name: str
email: str
Alembicの初期設定
次に、Alembicを初期化します。
alembic init migrations
これにより、alembic.ini
ファイルとmigrations
ディレクトリが作成されます。
alembic.ini
ファイルを開き、データベースの接続URLを設定します
sqlalchemy.url = postgresql://user:password@localhost/dbname
Alembicの設定ファイルを編集
migrations/env.py
ファイルを開き、以下のように編集します。
from models import User
target_metadata = User.metadata
ここでは、SQLModelのメタデータとモデルクラスをインポートし、target_metadata
に設定しています。
script.py.makoの修正
migrations
/script.py.mako
ファイルを開き、以下のように編集します。
"""${message}
Revision ID: ${up_revision}
Revises: ${down_revision | comma,n}
Create Date: ${create_date}
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
import sqlmodel #sqlmodelを追加
${imports if imports else ""}
# revision identifiers, used by Alembic.
revision: str = ${repr(up_revision)}
down_revision: Union[str, None] = ${repr(down_revision)}
branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)}
depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)}
def upgrade() -> None:
${upgrades if upgrades else "pass"}
def downgrade() -> None:
${downgrades if downgrades else "pass"}
マイグレーションファイルの生成
モデルを変更したら、以下のコマンドでマイグレーションファイルを生成します。
alembic revision --autogenerate -m "Initial migration"
これにより、migrations/versions
ディレクトリ内にマイグレーションファイルが生成されます。
migrations/versions/配下に生成されたマイグレーションファイルのコードの一部に修正が必要が可能性があります
マイグレーションの適用
最後に、以下のコマンドでマイグレーションを適用します。
alembic upgrade head
これで、データベーススキーマがモデルの定義に合わせて更新されます。
まとめ
SQLModelとAlembicを使うことで、Pythonのコードベースでデータモデルを管理しつつ、データベーススキーマの変更を追跡・適用できます。
モデルを変更したら、マイグレーションファイルを生成し、適用するだけで、データベースを最新の状態に保つことができます。
ぜひ、SQLModelとAlembicを使ったマイグレーション管理を試してみてください。
参考文献
コメント