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

How to import the own model into myproject/alembic/env.py?

我想将 alembic revision --autogenerate 与我自己的模型 类 一起使用。因此,我需要将它们导入 myproject/alembic/env.py 作为 described in the docs。但是即使我尝试了很多变化,这也不起作用。

我不确定运行 env.py 在哪个上下文中(不知道这个词是否正确)。也许这会导致一些错误。

这是我使用的目录和文件结构。

myproject/
    common/
        __init__.py
        model.py
    alembic/
        env.py

错误是这样的

    from .common import model
SystemError: Parent module '' not loaded, cannot perform relative import

myproject 本身只是一个 repository/working 目录。它没有 安装 到系统中(pip3apt-geteasyinstall 或其他)。

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

. ← 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

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

希望您觉得这有用! :)

编辑: 然后我在数据库为空(还没有表)的情况下进行了第一次修订,alembic 自动为 upgrade()downgrade() 填充了所有内容.我这样做是因为并非我所有的表都是 自动 被 alembic 检测到的。

您可以设置 PYTHONPATH 环境变量来控制 python 将什么视为顶级文件夹,例如。如果您位于项目的根文件夹中:

PYTHONPATH=. alembic revision -m "..."

然后您可以在您的 alembic env.py 中使用 "normal" 导入,相对于您的根文件夹,在您的示例中:

from src.models.base import Base

将此放入您的 env.py 以将工作目录放入 Python 路径:

import sys
import os

sys.path.insert(0, os.getcwd())

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

prepend_sys_path = .

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