2013-07-09 6 views
5

플라스크 + sqlalchemy 프로젝트에 대해 alembic 마이그레이션을 사용하고 있으며 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이 사용하는 다른 세션을 사용하고 있습니다. 그것은 데이터베이스를 쿼리하려고하지만 당신이 그것을 변경하기 때문에 테이블이 잠겨 있습니다. 그래서 업그레이드가 기다리고 기다리고 있습니다. 왜냐하면 두 세션이 서로 기다리고 있기 때문입니다. @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

. 모델 클래스를 사용해야하는 경우 마이그레이션을 자체 포함되도록 마이그레이션 파일에서 다시 정의해야합니다. 그 이유는 한 번에 여러 마이그레이션을 실행할 수 있기 때문이며 마이그레이션이 실제로 수행 될 때까지는 "나중에"마이그레이션에 따라 모델 클래스가 변경 될 수 있기 때문입니다.