2013-07-09 8 views
5

私はalembicマイグレーションをフラスコ+ sqlalchemyプロジェクトに使用していますが、私はalembicでモデルを照会しようとするまで期待通りに動作します。alembicマイグレーションでのモデルへのアクセス

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) 

上記のコードでは、列を追加し後を立ち往生して出てくることはありません取得します。私はStoredFile.queryが、alembicで使用されているものとは異なるデータベース接続を使用しようとしていると思います。 (しかし、どうしてですか?env.pyで何かが見つからないのですか?)

op.get_bind().execute(...)を使用して解決できましたが、どうすればモデルをalembicで直接使用できますか?

答えて

0

私は同じ問題を抱えていました。 StoredFile.queryを使用する場合、alembicが使用している別のセッションを使用しています。データベースにクエリを実行しようとしましたが、テーブルを変更しているためにテーブルがロックされています。だから、あなたがお互いに待っている2つのセッションがあるので、アップグレードはただそこに座って永遠に待ちます。 @SowingSadness応答に基づいて、これは私の仕事:あなたのアレンビックの移行にmodelを使うべきではありません

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

。モデルクラスを使用する必要がある場合は、それらをマイグレーションファイルに再定義して、マイグレーションを自己完結型にする必要があります。その理由は、複数のマイグレーションを一度に実行できるため、マイグレーションが実際に実行されるまでに、「後の」マイグレーションに従ってモデルクラスが変更された可能性があるからです。

関連する問題