2013-07-09 10 views
5

Ich benutze Alembic Migrationen für eine Flasche + sqlalchemy Projekt und die Dinge funktionieren wie erwartet, bis ich versuche, die Modelle in Alembic abzufragen.Zugriff auf Modelle in Alembic Migrationen

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) 

Der obige Code nach Spalte hinzufügen und kommt nie heraus stecken bleibt. Ich denke, die versucht, eine andere Datenbankverbindung als die von Alembic verwendet zu verwenden. (Aber warum? Fehle ich etwas in env.py?)

Ich könnte es lösen, indem Sie die op.get_bind().execute(...) verwenden, aber die Frage ist, wie kann ich die Modelle direkt in Alembic verwenden?

Antwort

0

Ich hatte das gleiche Problem. Wenn Sie StoredFile.query verwenden, verwenden Sie eine andere Sitzung, die von Alembic verwendet wird. Es versucht, die Datenbank abzufragen, aber die Tabelle ist gesperrt, weil Sie sie ändern. Das Upgrade sitzt also einfach da und wartet ewig, weil zwei Sitzungen auf einander warten. Basierend auf @SowingSadness Antwort arbeitete für mich:

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

Sie nicht model in Ihrem alembic Migrationen verwenden sollten. Wenn Sie Modellklassen verwenden müssen, sollten Sie sie in den Migrationsdateien neu definieren, um die Migration eigenständig zu machen. Der Grund dafür ist, dass mehrere Migrationen gleichzeitig ausgeführt werden können, und es ist möglich, dass die Modellklassen zu dem Zeitpunkt, an dem die Migration tatsächlich durchgeführt wird, entsprechend einer "späteren" Migration geändert wurden.

Verwandte Themen