Alembic无法导入Flask应用程序的ORM模型
使用场景:
我正在尝试创建一个迁移脚本,这个脚本会创建一个表(这个表会建立多对多的关系),然后用数据库中的外键来填充这个表。
为此,我想加载我的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)))
让我的路径再上升了一个目录。