【问题标题】:Alembic: alembic revision says Import ErrorAlembic:alembic 修订版显示导入错误
【发布时间】:2023-03-02 22:17:01
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: python flask flask-sqlalchemy alembic


    【解决方案1】:

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

    python -m alembic.config upgrade head
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 为了更好、更持久的解决方案,我赞同@Palasaty 的建议。只需更新您的 env.py 文件以使用正确的目录。
      • 我的首选解决方案与@zzzeek 的建议相呼应,即使用revision_environment=True 来获得使用env.py 的修订:alembic.zzzcomputing.com/en/latest/…
      • PYTHONPATH=。将包含当前目录,它也可以解决问题。
      • 如果您的设置是 docker-compose,您可以将这个变量设置为:docker-compose run --rm -e PYTHONPATH=. <container_name> alembic <alembic_command> for 1 time commands。
      【解决方案3】:

      你说你从目录project/db 运行类似alembic migrate --autogenerate -m 'migration description' 的东西并得到ImportError,对吧?

      如果是这样,问题就很明显了。

      请参阅:您尝试导入 configuration 模块并导致错误。然后你把sys.path.append(os.getcwd()) - 换句话说,你将current 目录添加到系统路径中。但是当前目录是什么?它是project/db,它下面没有configuration 模块,所以你继续得到ImportError

      解决方法是添加到系统路径父目录-project,其中包含configuration模块。像这样:

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

      【讨论】:

      • 不幸的是,这个答案对我不起作用。我正在使用@daydreamer 的解决方案,我运行我的命令PYTHONPATH=. alembic <command_name>
      【解决方案4】:

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

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

      【讨论】:

      • 注意不需要--autogenerate,请使用revision_environment=True:alembic.zzzcomputing.com/en/latest/…
      • 您是否找到了另一种不使用--autogenerate 来调用env.py 文件的方法?
      • @zzzeek 我尝试使用revision_environment=true,但遇到了同样的问题。
      • true 中的 t 必须是大写的 T。它是 Python。
      • @dbinott 它不是 python 代码,zzzeek 是从共享链接引用 alembic.ini 文件。顺便说一句,我仍然必须使用 PYTHONPATH=。 ,revision_environment=true 并没有为我修复它(也尝试了 True 大写 T)
      猜你喜欢
      • 2018-05-25
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多