SIMPLE

FastAPI + SQLAlchemy + Alembicでmigrationを実行する方法

FastAPI + SQLAlchemyでモデル定義などの実装は済んでいる前提として、ローカル環境でテスト用のDB(SQLite)にAlembicを用いてmigrationを実行する方法を説明する。

必要なライブラリのインストール

pip install alembic sqlalchemy sqlalchemy-utils

alembicの初期化

alembic init migrations
# カレントディレクトリに以下のようなファイルとディレクトリが生成される
.
├── alembic.ini
└── migrations
    ├── README
    ├── env.py
    ├── script.py.mako
    └── versions

elembic.iniの修正

DATABASE_URLは環境変数から読み込むようにしたいので、以下の行をコメントアウト。

# sqlalchemy.url = driver://user:pass@localhost/dbname

migrations/env.pyの修正

########################################
# 追記
# Baseモデルを独自に定義している場合はimport
# migrationに含めたいモデルクラスを全てimport
########################################
from libs.constants import DATABASE_URL
from libs.models.base import Base
from libs.models.message import Message  # noqa: F401
from libs.models.user import AdminUser, User  # noqa: F401
########################################

# this is the Alembic Config object, which provides
# access to the values within the .ini file in use.
config = context.config

########################################
# 追記
# alembic.iniの修正に対応してDATABASE_URLを環境変数から取得する
########################################
# .envファイルからDATABASE_URLを取得してsqlalchemy.urlに設定する
config.set_main_option("sqlalchemy.url", DATABASE_URL)
########################################

# Interpret the config file for Python logging.
# This line sets up loggers basically.
if config.config_file_name is not None:
    fileConfig(config.config_file_name)

# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel

########################################
# 追記
# 上記でimportしたBaseモデルのメタデータを参照するよう修正
########################################
target_metadata = Base.metadata
# target_metadata = None
########################################

migrationファイルの生成

alembic revision --autogenerate -m "Initilalize Tables"

(主キーにUUIDを使用している場合のみ)sqlalchemy-utilsのimport

主キーにUUIDを使用している場合のみ、migrations/versions/配下に生成されたmigrationファイルに以下のimport文を追記する。

import sqlalchemy_utils # noqa: F401

migrationの実行

alembic upgrade head

oddy

"チーバくんの目"のあたりで暮らす、フリーランスエンジニアのoddyです。 サイト名の"OJTHON"(オジソン)の由来は、わが家での私のあだ名とプログラミング言語Python(パイソン)のもじりです。 僕たち家族の思い出と記録、そして今の僕が考えることについて、何かしらの形にして残していきたいと思い、このOJTHON.dev HOME / BLOGを作りました。