2013-07-09 15 views
5

Używam migracji alembików dla projektu kolby + sqlalchemy i rzeczy działają zgodnie z oczekiwaniami, dopóki nie spróbuję wysłać zapytania do modeli w alembiku.Uzyskiwanie dostępu do modeli w migracji alembików

from models import StoredFile 

def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    op.add_column('stored_file', sa.Column('mimetype', sa.Unicode(length=32)) 
    for sf in StoredFile.query.all(): 
     sf.mimetype = guess_type(sf.title) 

Powyższy kod utknie po dodając kolumnę i nigdy nie wychodzi. Domyślam się, że StoredFile.query próbuje użyć innego połączenia z bazą danych niż ten używany przez alembik. (Ale dlaczego? Czy brakuje mi czegoś w env.py?)

Mogłabym go rozwiązać za pomocą op.get_bind().execute(...), ale pytanie brzmi: jak mogę korzystać z modeli bezpośrednio w alembiku?

Odpowiedz

0

Miałem ten sam problem. Podczas korzystania ze StoredFile.query używasz innej sesji, z której korzysta alembik. Próbuje wysłać zapytanie do bazy danych, ale tabela jest zablokowana, ponieważ zmieniasz ją. Więc uaktualnienie właśnie tam siedzi i czeka na zawsze, ponieważ masz dwie sesje czekające na siebie. Na podstawie @SowingSadness odpowiedzi, to pracował dla mnie:

from models import StoredFile 

def upgrade(): 
    ### commands auto generated by Alembic - please adjust! ### 
    op.add_column('stored_file', sa.Column('mimetype', sa.Unicode(length=32)) 

    connection = op.get_bind() 
    SessionMaker = sessionmaker(bind=connection.engine) 
    session = SessionMaker(bind=connection) 
    for sf in session.query(StoredFile): 
     sf.mimetype = guess_type(sf.title) 
    session.flush() 
    op.other_operations() 
1

Nie należy stosować model w swoim alembic migracje. Jeśli potrzebujesz użyć klas modeli, powinieneś przedefiniować je w plikach migracji, aby migracja stała się niezależna. Powodem jest to, że kilka migracji może zostać uruchomionych jednocześnie i możliwe jest, że do czasu przeprowadzenia migracji klasy modeli zostały zmienione zgodnie z "późniejszą" migracją.

Powiązane problemy