如何将自己的模型导入myproject/alembic/env.py?

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)

  • 我觉得这应该在 Alembic 文档中和/或由 alembic 处理...默认实现的非常明显的问题... (4认同)
  • 谢谢,这是一个令人抓狂的问题的简单答案. (2认同)

sha*_*kra 9

在同样的问题上摆弄了几个小时,我发现了一个解决方案.首先,这是我现在的结构:

. ? 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 自动检测到的.


Rom*_*nyi 9

对于 alembic 1.5.5 及更高版本,请将以下内容添加到您的alembic.ini

prepend_sys_path = .
Run Code Online (Sandbox Code Playgroud)

来自alembic 文档:这将被添加到 sys.path 如果存在的话,默认为当前工作目录。

  • 这是最好的解决方案。我的“alembic”文件夹位于项目根目录中,通过将此路径更改为“..”,我可以在“app/models.py”中导入模型。 (4认同)