0

用例:

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

为此,我试图加载我的烧瓶应用程序 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 参数对我没有用。

4

2 回答 2

0

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

于 2014-03-12T02:17:04.683 回答
0

简短的回答:

尝试从 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)))
于 2014-03-12T19:22:51.820 回答