buh*_*htz 14 python-import python-3.x alembic
我想alembic revision --autogenerate用我自己的模型类.正因为如此,我需要将它们导入myproject/alembic/env.py如在文档描述.但即使我尝试了很多变化,这也行不通.
我不确定在哪种情况下(不知道这是否是正确的单词)alembic运行env.py.也许这会导致一些错误.
这是我使用的目录和文件结构.
myproject/
common/
__init__.py
model.py
alembic/
env.py
Run Code Online (Sandbox Code Playgroud)
错误就是那种
from .common import model
SystemError: Parent module '' not loaded, cannot perform relative import
Run Code Online (Sandbox Code Playgroud)
myproject本身只是一个存储库/工作目录.它不安装到系统中(用pip3,apt-get,easyinstall或其他任何东西).
Joe*_*fer 17
把它放在你的 env.py 中,把工作目录放到 Python 路径上:
import sys
import os
sys.path.insert(0, os.getcwd())
Run Code Online (Sandbox Code Playgroud)
K. *_*ert 15
您可以设置PYTHONPATH环境变量来控制python看到的顶级文件夹,例如.如果您位于项目的根文件夹中:
PYTHONPATH=. alembic revision -m "..."
Run Code Online (Sandbox Code Playgroud)
然后,您可以在示例中使用相对于根文件夹的alembic env.py中的"普通"导入:
from src.models.base import Base
Run Code Online (Sandbox Code Playgroud)
在同样的问题上摆弄了几个小时,我发现了一个解决方案.首先,这是我现在的结构:
. ? That's the root directory of my project
??? alembic.ini
??? dev-requirements.txt
??? requirements.txt
??? runtime.txt
??? setup.cfg
??? src
? ??? models
? ??? base.py
? ...
? ??? migrations
? ??? env.py
? ??? README
? ??? script.py.mako
? ??? versions
?
??? tests
Run Code Online (Sandbox Code Playgroud)
在env.py我只是这样做:
import sys
from os.path import abspath, dirname
sys.path.insert(0, dirname(dirname(dirname(abspath(__file__))))) # Insert <.>/src
import models # now it can be imported
target_metadata = models.base.Base.metadata
Run Code Online (Sandbox Code Playgroud)
希望你觉得这个有用!:)
编辑:然后我做了我的第一次修改与数据库空(没有表),alembic自动填充所有upgrade()和downgrade().我这样做是因为并非所有的表都是由alembic 自动检测到的.
对于 alembic 1.5.5 及更高版本,请将以下内容添加到您的alembic.ini:
prepend_sys_path = .
Run Code Online (Sandbox Code Playgroud)
来自alembic 文档:这将被添加到 sys.path 如果存在的话,默认为当前工作目录。
| 归档时间: |
|
| 查看次数: |
3660 次 |
| 最近记录: |