2013-03-26 54 views
15

我想我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 

我試着在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'文件以使用正確的目錄。 – 2017-06-09 18:32:56

1

我們遇到了同樣的問題,它歸結爲env.py不會被版本號調用,除非設置了--autogenerate標誌。您可以通過在env.py文件的頂部放置打印語句來測試這一點。

我們正在通過與--autogenerate聯繫,然後刪除生成的代碼來解決此問題。

7

你說你跑目錄project/db之類的alembic migrate --autogenerate -m 'migration description',得到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)