【備忘録】SQLModelとAlembicでマイグレーションしてみた

sqlmodelとalembicでマイグレーションしてみた プログラミング

はじめに

最近開発している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を使ったマイグレーション管理を試してみてください。

参考文献

SQLModel で設計したモデルを Alembic でマイグレーション - Qiita
背景作成したDBモデルを簡単に管理するためにマイグレーション機能を実装しようといくつかその方法を調べたところ、Alembicというものがありました。Alembicはモデルを再設計した際に、以前ま…

コメント

タイトルとURLをコピーしました