2013-07-27 10 views
7

私は、オンラインエンジンのマイグレーションを実行するために、alembicをMySQLエンジンとともに使用しようとしています。私のonupgrade()メソッドの操作が失敗したときに、データベースが不整合な状態に陥ってしまい、onupgrade()の失敗前に発生した操作を手動でクリーンアップするまで、私はalembicを使用できないことがわかりました不完全なalembic runのクリーンアップ方法

例:私はこれを実行するとop.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') 

だから、私はADD_COLUMNラインを修正しても、今「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モデルファイルにロールバックすることができます。