2013-03-26 3 views
15

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

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 

Я попробовал решение, упомянутые в Request a simple alembic working example for Auto Generating Migrations, но он не работает для меня

Мой метод в env.pyrun_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() 

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

ответ

19

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

+0

побежал Для лучшего, более постоянного решения, я второй, что предложил @Palasaty. Просто обновите файл 'env.py', чтобы использовать правильный каталог. –

1

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

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

7

Вы говорите, что вы запускаете что-то вроде 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) 
Смежные вопросы