2024年9月8日日曜日

Alembic で does not provide a MetaData object or sequence of objects to the context.

Alembic で does not provide a MetaData object or sequence of objects to the context.

概要

autogenerate オプションを付与すると発生するエラーになります
対策を紹介します

環境

  • Ubuntu 22.04
  • Python 3.10.2
  • alembic 1.13.2

env.py に metadata を追加する

DeclarativeBase or declarative_base で作成された Base クラスを import しその metadata を参照します
ポイントはちゃんとマイグレーションする際の context.configure にも metadata 情報を渡す点です

  • vim env.py
from app.models import Base
target_metadata = Base.metadata
def run_migrations_online() -> None:
    """Run migrations in 'online' mode.

    In this scenario we need to create an Engine
    and associate a connection with the context.

    """
    configuration = config.get_section(config.config_ini_section)
    if configuration is None:
        raise ValueError()
    connectable = engine_from_config(
        configuration=configuration,
        prefix="sqlalchemy.",
        poolclass=pool.NullPool,
    )

    with connectable.connect() as connection:
        context.configure(
            connection=connection,
            target_metadata=target_metadata,  # <= ここでちゃんと設定するのが重要
        )

        with context.begin_transaction():
            context.run_migrations()

最後に

あとは普通にマイグレーションできるか確認すれば OK です
almbic や sqlalchemy を最新にすると発生することがあるようです

0 件のコメント:

コメントを投稿