28

我正在尝试将我的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.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()

我怎样才能解决这个问题?

4

4 回答 4

44

我做export PYTHONPATH=<path_to_project>了并再次运行命令,它运行成功

于 2013-04-02T16:22:59.513 回答
17

你说你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)
于 2013-03-31T21:22:05.753 回答
2

我们遇到了同样的问题,归结为 env.py 不会被修订调用,除非设置了--autogenerate标志。您可以通过在 env.py 文件顶部放置一条打印语句来测试它。

我们正在通过调用 with--autogenerate然后删除生成的代码来解决它。

于 2013-03-30T21:18:13.197 回答
0

对于那些不想PYTHONPATH在运行 alembic 之前手动设置的人。您可以将 alembic 作为模块运行,例如:

python -m alembic.config upgrade head
于 2021-08-29T05:50:33.343 回答