FastAPI + SQLAlchemy + Alembic を使って開発中のエラー。備忘録がてらブログに残しておきます。
API 実行時に以下のエラーが出ました。
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: sakes.created_by_id
テーブル sakes に必要なカラム created_by_id が存在していません。
モデルでは定義しているのに DB に反映されていない状態です。
Alembic でマイグレーションを流そうとすると、今度はこんなエラー。
sqlite3.OperationalError: duplicate column name: password
既に users テーブルに password カラムがあるのに、再度追加しようとして失敗しています。
要するに「DB と Alembic の履歴がズレている」状態。
既に存在しているカラムについては、DB に合わせて履歴を進めるだけでOK。
poetry run alembic stamp 3ed4e13e6b65
これで「password はもうあるよ」と Alembic に教えました。
不足していた sakes.created_by_id を追加するためのリビジョンを作成。
poetry run alembic revision -m "add created_by_id to sakes"
生成されたファイルに処理を追記:
def upgrade() -> None:
with op.batch_alter_table("sakes") as batch:
batch.add_column(sa.Column("created_by_id", sa.Integer(), nullable=True))
batch.create_index("ix_sakes_created_by_id", ["created_by_id"])
そして適用!
poetry run alembic upgrade head
sqlite3 ochoko.db "PRAGMA table_info(sakes);"
ちゃんと created_by_id が入っているのを確認。
API を再実行したら 500 エラーが消えました 🎉
coiai
この記事もおすすめ
株式会社coiaiは、「想像できることを美しく実現」を掲げ、XR・Web・アプリ・システム開発およびDX支援を行う会社です。 創業2022年、東京都練馬区に本社を置き、要件のヒアリングからPoC(概念実証)、本番運用まで一貫して伴走します。 まずはお気軽にご相談ください。
主なご相談内容
詳しい会社情報は会社概要ページでご覧いただけます。