2013-03-26 35 views
15

Próbuję zintegrować mój projekt Flask z Alembic
Moja struktura aplikacja wyglądaAlembik: rewizja alembic mówi importu Błąd

project/ 
     configuration/ 
        __init__.py 
        dev.py 
        test.py 
     core/ 
      # all source code 
     db/ 
     migrations/ 
        __init__.py 
        alembic.ini 
        env.py 
        versions/ 

Kiedy próbuję uruchomić następujące polecenia z moim katalogu db widzę

File "migration/env.py", line 55, in run_migrations_online 
    from configuration import app, db 
ImportError: No module named configuration 

próbowałem roztworu wzmiankowanym w Request a simple alembic working example for Auto Generating Migrations, ale to nie działa dla mnie

Moja metoda env.pyrun_migrations_online() ze zmian jest

def run_migrations_online(): 
    """Run migrations in 'online' mode. 

    In this scenario we need to create an Engine 
    and associate a connection with the context. 

    """ 
    import os 
    import sys 

    sys.path.append(os.getcwd()) 
    from configuration import app, db 

    alembic_config = config.get_section(config.config_ini_section) 
    alembic_config['sqlalchemy.url'] = app.config['SQLALCHEMY_DATABASE_URI'] 
    target_metadata = db.metadata 

    engine = engine_from_config(
     alembic_config, 
     prefix='sqlalchemy.', 
     poolclass=pool.NullPool) 

    connection = engine.connect() 
    context.configure(
     connection=connection, 
     target_metadata=target_metadata 
    ) 

    try: 
     with context.begin_transaction(): 
      context.run_migrations() 
    finally: 
     connection.close() 


if context.is_offline_mode(): 
    run_migrations_offline() 
else: 
    run_migrations_online() 

Jak mogę rozwiązać ten problem?

Odpowiedz

19

zrobiłem export PYTHONPATH=<path_to_project> i pobiegł ponownie komendę i prowadził z powodzeniem

+0

Dla lepszego, bardziej trwałe rozwiązanie, to drugi co sugeruje @Palasaty. Po prostu zaktualizuj swój plik 'env.py', aby użyć właściwego katalogu. –

1

Wystąpił ten sam problem, sprowadza się on do tego, że env.py nie jest wywoływany przez wersję , chyba że ustawiono flagę --autogenerate. Możesz to przetestować, umieszczając instrukcję drukowania u góry pliku env.py.

Pracujemy nad tym, dzwoniąc pod numer --autogenerate, a następnie usuwając wygenerowany kod.

7

Mówisz, że prowadzisz coś w rodzaju alembic migrate --autogenerate -m 'migration description' z katalogu project/db i otrzymujesz ImportError, prawda?

Jeśli tak, problem jest oczywisty.

Patrz: próbujesz importować moduł configuration, co powoduje błędy. Następnie wstawiasz sys.path.append(os.getcwd()) - innymi słowy dodajesz bieżący katalog do ścieżki systemowej. Ale jaki jest bieżący katalog? Jest to project/db i nie ma pod nim modułu configuration, więc nadal otrzymujesz ImportError.

Rozwiązanie polega na dodaniu do katalogu nadrzędnego ścieżki systemowej - project, który zawiera moduł configuration. Tak:

parent_dir = os.path.abspath(os.path.join(os.getcwd(), "..")) 
sys.path.append(parent_dir) 
Powiązane problemy