カテゴリー: FastAPI

  • SQLite + Alembic 「no such column」「duplicate column name」の解決法

    FastAPI + SQLAlchemy + Alembic を使って開発中のエラー。備忘録がてらブログに残しておきます。


    エラーその1: no such column

    API 実行時に以下のエラーが出ました。

    sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such column: sakes.created_by_id

    テーブル sakes に必要なカラム created_by_id が存在していません。

    モデルでは定義しているのに DB に反映されていない状態です。


    エラーその2: duplicate column name

    Alembic でマイグレーションを流そうとすると、今度はこんなエラー。

    sqlite3.OperationalError: duplicate column name: password

    既に users テーブルに password カラムがあるのに、再度追加しようとして失敗しています。

    要するに「DB と Alembic の履歴がズレている」状態。


    解決手順

    1. Alembic 履歴を DB に合わせる

    既に存在しているカラムについては、DB に合わせて履歴を進めるだけでOK。

    poetry run alembic stamp 3ed4e13e6b65

    これで「password はもうあるよ」と Alembic に教えました。


    2. 新しいカラムを追加するマイグレーションを作成

    不足していた 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

    3. 確認

    sqlite3 ochoko.db "PRAGMA table_info(sakes);"

    ちゃんと created_by_id が入っているのを確認。

    API を再実行したら 500 エラーが消えました 🎉