【问题标题】:Alembic not able to import flask application ORM modelsAlembic 无法导入烧瓶应用程序 ORM 模型
【发布时间】:2023-03-29 23:26:02
【问题描述】:

用例:

我正在尝试创建一个迁移脚本,该脚本将创建一个表(这将建立多对多关系),然后使用数据库中的外键填充该表。

为此,我正在尝试加载我的烧瓶应用程序 ORM 模型,以便可以在我的迁移脚本中使用它们。

目录结构

/home/alord/git/my_project/  #  project directory
/home/alord/git/my_project/alembic_testing  #  migration directory
/home/alord/git/my_project/my_project #requirement of flask modules
/home/alord/git/my_project/runserver.py  #  script that starts development server
/home/alord/git/my_project/alembic.ini  #  alembic configuration
/home/alord/git/my_project/development_config.py  #  development server configuration

如果我运行 alembic upgrade +1

import os
print os.getcwd()
print os.path.dirname(os.path.realpath(__file__))

/home/alord/git/my_project/alembic_testing/env.py

我明白了

/home/alord/git/my_project
/home/alord/git/my_project/alembic_testing

我在做什么

我正在放置

import os.path
sys.path.append(
    os.path.abspath(os.path.join(os.path.dirname(__file__), os.path.pardir)))
import my_project

在我的升级脚本中然后运行命令

alembic upgrade +1

我正在收到带有错误的堆栈跟踪

ImportError: No module named my_project

如果没有此尝试导入,表升级和降级功能将正常运行。

我的期望

我希望能够导入包,更重要的是 *my_project.models* 以便我可以使用 ORM 填充我的新表。

注意: 我不能使用相对包包含,因为我正在运行 alembic 而不是调用 python。因此, python -m 参数对我没有用。

【问题讨论】:

    标签: python sqlalchemy flask-sqlalchemy alembic


    【解决方案1】:

    修复alembic.ini 中的script_location 以指向正确的位置,然后只需从存储库的根目录(/home/alord/git/) 运行alembic,您就不需要任何sys.path hijinks能够导入您的应用程序。

    【讨论】:

    • 我的脚本位置指向 alembic_testing 文件夹,但我仍然遇到此错误。
    • 我在示例路径中为您提供了错误的目录结构。这个答案不适用于我的问题。
    • 我不明白为什么它不会,但如果没有更多信息,我没有任何进一步的见解
    【解决方案2】:

    简答:

    尝试从 alembic 中的修订文件导入会使您下降两个目录而不是一个。

    长答案:

    所以我最终打印出我的 sys.path 以查看实际包含哪些目录。当我注意到包含的路径是

    /home/alord/git/my_project/alembic_testing
    

    而不是

    /home/alord/git/my_project/alembic_testing
    

    我让我的 path.append 再上一个目录,

    import sys
    import os.path
    
    #hacky solution to get to the root application directory.
    sys.path.append(
            os.path.abspath(
                os.path.join(
                    os.path.join(
                        os.path.dirname(__file__),
                        os.path.pardir),
                    os.path.pardir)))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-01
      • 1970-01-01
      • 2015-09-07
      • 2016-12-23
      • 1970-01-01
      • 2018-11-27
      • 2020-11-17
      相关资源
      最近更新 更多