如何将自己的模型导入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 目录。它没有 安装 到系统中(pip3
、apt-get
、easyinstall
或其他)。
我在同一个问题上摆弄了几个小时,找到了解决方案。首先,这是我现在的结构:
. ← 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 之前,默认为当前工作目录。
我想将 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 目录。它没有 安装 到系统中(pip3
、apt-get
、easyinstall
或其他)。
我在同一个问题上摆弄了几个小时,找到了解决方案。首先,这是我现在的结构:
. ← 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 之前,默认为当前工作目录。