Alembic无法导入Flask应用程序的ORM模型

0 投票
2 回答
1524 浏览
提问于 2025-04-17 21:52

使用场景:

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

为此,我想加载我的Flask应用程序的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这个参数对我没有用。

2 个回答

0

把你的 alembic.ini 文件里的 script_location 设置成正确的路径,然后直接在你项目的根目录下(/home/alord/git/)运行 alembic,这样就不需要搞什么 sys.path 的复杂操作,就能顺利导入你的应用了。

0

简短回答:

从修订文件导入到alembic时,你会发现它的目录层级比预期多了一个。

详细回答:

我最后打印了我的 sys.path,想看看实际包含了哪些目录。当我发现包含的路径是

/home/alord/git/my_project/alembic_testing

而不是

/home/alord/git/my_project/alembic_testing

于是我通过使用

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)))

让我的路径再上升了一个目录。

撰写回答