나는 온라인 마이그레이션을 수행하기 위해 MySQL 엔진과 함께 alembic을 사용하려고합니다. 나는 onupgrade() 메소드의 작동이 실패 할 때 데이터베이스가 일관성없는 상태에서 멈추고 onupgrade()에서 실패하기 전에 발생한 모든 작업을 수동으로 정리할 때까지 사용할 수 없음을 발견했습니다.불완전한 alembic run을 정리하는 방법
예 :이 프로그램을 실행하고 op.add_column 내가 add_column 라인을 수정하는 경우에도, 실패 할 경우
def upgrade():
op.create_table('sometable',
Column('id', INTEGER, primary_key=True),
Column('name', VARCHAR(150), nullable=False, unique=True))
op.add_column('anothertable' Column('id', INTEGER))
op.create_table('secondtable')
그래서, 지금 "sometable는"그래서 첫 번째 작업은 항상 실패합니다 존재한다. alembic은 업그레이드를 완료하지 않았기 때문에 버전을 업데이트하지 않았기 때문에 다운 그레이드 스크립트를 실행할 수 없습니다.
강제로 내 ondowngrade()를 실행하는 방법이 있다면 유용 할 수도 있습니다. 오류가 있다는 것을 무시해야합니다. 확실한 것은 있습니다. "secondtable"을 삭제하는 것과 같습니다. 나는 이것을 어떻게해서든지 그러나 발견 할 수 없었다.
누구든지이 문제를 해결할 수있는 좋은 방법이 있습니까?
그냥 추측 : 나는 alembic이 트랜잭션에서 마이그레이션을 실행하려고 시도하고 오류를 롤백했다는 것을 의심 할 것입니다. 그러나 아마도 MySQL 구성이 트랜잭션을 지원하지 않을 것입니다. 운이 좋다. – moschlar
그건 내가 두려워했던거야, MySQL은 DDL 문장에 대한 트랜잭션을 지원하지 않는다. (http://dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html – jjulien