2013-07-09 26 views
5

Bir şişe + sqlalchemy projesi için alembic migrasyon kullanıyorum ve alembic modellerini sorgulamaya çalışıncaya kadar işler çalışıyor.Alembic migrasyonlarda modellere erişme

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) 

Yukarıdaki kod sütun ekleyerek sonra sıkışmış ve dışarı çıkmaz alır. Sanırım StoredFile.query, alembic tarafından kullanılandan farklı bir veritabanı bağlantısı kullanmaya çalışıyor. (Ama neden? env.py içinde bir şey eksik miyim?)

op.get_bind().execute(...) kullanarak çözebilirdim ama soru doğrudan alembic'te nasıl kullanabilirim?

cevap

0

Aynı problem vardı. StoredFile.query kullandığınızda, alembic'in kullandığı farklı bir oturum kullanıyorsunuz. Veritabanını sorgulamaya çalışır ancak tabloyu değiştirdiğiniz için kilitlenir. Yani yükseltme sadece orada oturur ve sonsuza kadar bekler çünkü birbiriniz için bekleyen iki seansınız vardır. @SowingSadness yanıt dayanarak, bu benim için çalıştı: Eğer alembic göçler içinde model kullanmamalısınız

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

. Model sınıflarını kullanmanız gerekiyorsa, taşıma işlemini kendi kendine yeten hale getirmek için bunları geçiş dosyalarında yeniden tanımlamanız gerekir. Bunun nedeni, birkaç geçişin aynı anda çalıştırılabilmesidir ve geçişin gerçekte gerçekleştirildiği zaman, model sınıfların "daha geç" bir geçişe uygun olarak değiştirilmesi mümkündür.