2015-08-16 9 views
6

Chcę używać alembic revision --autogenerate z własnymi klasami modeli. Z tego powodu muszę zaimportować je w myproject/alembic/env.py jako described in the docs. Ale to nie działa, nawet jeśli próbowałem wielu odmian.Jak zaimportować własny model do myproject/alembic/env.py?

Nie jestem pewien w jakim kontekście (nie wiem, czy to jest właściwe słowo) czy alembik uruchamia env.py. Może to powoduje błędy.

To jest katalog i struktura plików, których używam.

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

Błąd jest rodzaj tego

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

myproject sam w sobie jest po prostu katalog roboczy repozytorium /. Nie jest on instalowany w systemie (z pip3, apt-get, easyinstall lub czymkolwiek innym).

Odpowiedz

4

Fiddling kilka godzin z tym samym problemem, znalazłem rozwiązanie. Po pierwsze, to jest moja struktura teraz:

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

w env.py ja po prostu to zrobił:

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 

Nadzieję, że to przydatne! :)

EDIT: Potem zrobiła moja pierwsza wersja z bazą danych (z pustym jeszcze żadnych tabel), alembic wypełnione wszystko automatycznie upgrade() i downgrade(). Zrobiłem to w ten sposób, ponieważ nie wszystkie moje tabele zostały wykryte przez alembik.

3

Możesz ustawić zmienną środowiskową PYTHONPATH, aby kontrolować, co Python widzi jako folder najwyższego poziomu, np. jeśli jesteś w folderze głównym projektu:

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

Następnie można użyć „normalnego” import w swoim alembic env.py, w stosunku do katalogu głównego, w przykładzie:

from src.models.base import Base 
+0

dzięki, jest to prosta odpowiedź na irytujący problem. –

Powiązane problemy