Alembic无法导入烧瓶应用ORM模型

时间:2014-03-12 01:55:11

标签: python sqlalchemy flask-sqlalchemy alembic

用例:

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

要做到这一点,我正在尝试加载我的烧瓶应用程序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升级+1

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

in

/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 :(得分:0)

将您的script_location修改为alembic.ini以指向正确的位置,然后从您的存储库的根目录alembic运行/home/alord/git/,并且您不应该&#39 ; t需要任何sys.path hijinks才能导入您的应用。

答案 1 :(得分: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)))