2013-07-27 6 views
7

나는 온라인 마이그레이션을 수행하기 위해 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"을 삭제하는 것과 같습니다. 나는 이것을 어떻게해서든지 그러나 발견 할 수 없었다.

누구든지이 문제를 해결할 수있는 좋은 방법이 있습니까?

+1

그냥 추측 : 나는 alembic이 트랜잭션에서 마이그레이션을 실행하려고 시도하고 오류를 롤백했다는 것을 의심 할 것입니다. 그러나 아마도 MySQL 구성이 트랜잭션을 지원하지 않을 것입니다. 운이 좋다. – moschlar

+1

그건 내가 두려워했던거야, MySQL은 DDL 문장에 대한 트랜잭션을 지원하지 않는다. (http://dev.mysql.com/doc/refman/5.0/en/cannot-roll-back.html – jjulien

답변

6

문제는 alembic과 관련이 없지만 DDL 문을 롤백 할 수없는 MySQL 사용에 있습니다.

따라서 수동 예외 처리를 수행하고 그 시점까지 성공한 작업을 되돌리는 것이 유일한 방법입니다.

이 (내 마음의 작성, 그래서 가장 우아한 해결책 어쩌면 조금 잘못은 아니지만, 난 당신이 요점을 얻을 희망) 같은

뭔가 : 당신이 버전 제어에있는 경우

def upgrade(): 
    try: 
     op.create_table('sometable', 
      Column('id', INTEGER, primary_key=True), 
      Column('name', VARCHAR(150), nullable=False, unique=True)) 
    except: 
     try: 
      op.drop_table('sometable') 
     except: 
      pass 
     raise 

    try: 
     op.add_column('anothertable' Column('id', INTEGER)) 
    except: 
     op.drop_table('sometable') 
     try: 
      op.drop_column('anothertable', 'id') 
     except: 
      pass 
     raise 

    try: 
     op.create_table('secondtable') 
    except: 
     op.drop_table('sometable') 
     op.drop_column('anothertable', 'id') 
     try: 
      op.drop_table('secondtable') 
     except: 
      pass 
     raise 
0

을 에서 이주하려는 데이터베이스 모델을 임시로 사용하여 이주를 작성할 수 있습니다. (당신은 버전 폴더를 비우고 임시 디렉터리에 모든 것을 넣어야 할 것입니다.) Alembic은 데이터베이스의 현재 상태를 모델과 비교하고 데이터베이스가 해당 상태에 도달하도록 마이그레이션 명령을 제공합니다. 이 경우 데이터베이스를 이전 상태로 되 돌리는 지침을 제공해야합니다. 생성 된 이주 명령을보고 자신이 필요로하는 것과 정확히 일치하는지 확인해야하지만 직접 생성하지 않아도됩니다.

그런 다음 마이그레이션을 삭제하고 최신 db 모델 파일로 롤백 할 수 있습니다. 그럼 당신은 당신이 시작한 지점으로 돌아 가야합니다