Alembic: alembic revision говорит об ошибке импорта

Я пытаюсь интегрировать мой проект Flask с Alembic
Моя структура приложения выглядит как

project/
       configuration/
                    __init__.py
                    dev.py
                    test.py
       core/
           # all source code
       db/
         migrations/
                    __init__.py
                    alembic.ini
                    env.py
                    versions/

Когда я пытаюсь запустить следующее из моего каталога db, я вижу

 File "migration/env.py", line 55, in run_migrations_online
    from configuration import app, db
ImportError: No module named configuration

Я попробовал решение, упомянутое в Запросить простой рабочий пример alembic для Auto Generating Migrations, но для меня это не работает

Мой метод в env.py run_migrations_online() с изменением

def run_migrations_online():
    """Run migrations in 'online' mode.

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

    """
    import os
    import sys

    sys.path.append(os.getcwd())
    from configuration import app, db

    alembic_config = config.get_section(config.config_ini_section)
    alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI']
    target_metadata = db.metadata

    engine = engine_from_config(
        alembic_config,
        prefix='sqlalchemy.',
        poolclass=pool.NullPool)

    connection = engine.connect()
    context.configure(
        connection=connection,
        target_metadata=target_metadata
    )

    try:
        with context.begin_transaction():
            context.run_migrations()
    finally:
        connection.close()


if context.is_offline_mode():
    run_migrations_offline()
else:
    run_migrations_online()

Как я могу это исправить?

Ответы

Ответ 1

Я сделал export PYTHONPATH=<path_to_project> и снова выполнил команду и успешно выполнил

Ответ 2

Вы говорите, что вы запускаете что-то вроде alembic migrate --autogenerate -m 'migration description' из каталога project/db и получаете ImportError, правильно?

Если это так, проблема очевидна.

Смотрите: вы пытаетесь импортировать модуль configuration, и это приводит к ошибкам. Затем вы помещаете sys.path.append(os.getcwd()) - другими словами, вы добавляете текущий каталог в системный путь. Но каков текущий каталог? Он project/db, и под ним нет модуля configuration, поэтому вы продолжаете получать ImportError.

Решение состоит в том, чтобы добавить в родительский каталог системного пути - project, который содержит модуль configuration. Например:

parent_dir = os.path.abspath(os.path.join(os.getcwd(), ".."))
sys.path.append(parent_dir)

Ответ 3

Мы столкнулись с той же проблемой, она сводится к тому, что env.py не вызывается версией , если не установлен флаг --autogenerate. Вы можете проверить это, поставив инструкцию печати вверху вашего файла env.py.

Мы работаем над этим, вызывая с помощью --autogenerate, затем удаляя сгенерированный код.