代码之家  ›  专栏  ›  技术社区  ›  buhtz

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

  •  33
  • buhtz  · 技术社区  · 9 年前

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

    我不确定alembic在哪个上下文中运行 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 它本身只是一个存储库/工作目录。它不是 安装 进入系统(带有 pip3 , apt-get , easyinstall 或任何其他)。

    4 回复  |  直到 9 年前
        1
  •  31
  •   K. Norbert    8 年前

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

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

    然后可以在alembic env中使用“正常”导入。py,相对于根文件夹,在示例中:

    from src.models.base import Base
    
        2
  •  21
  •   shackra    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
    

    在里面 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检测到。

        3
  •  17
  •   Joe Heffer    6 年前

    把这个放在你的信封里。py将工作目录放到Python路径上:

    import sys
    import os
    
    sys.path.insert(0, os.getcwd())
    
        4
  •  3
  •   Roman Nakutnyi    3 年前

    对于alembic 1.5.5及以上版本,请将以下内容添加到 alembic.ini :

    prepend_sys_path = .
    

    从…起 alembic documentation :这将在sys。路径(如果存在)默认为当前工作目录。