大きな編集は、私が以前に持っていた特定のものではなく、抽象的な「行動」の話です。それらはほんの一例でした。 (;などの列を変更するテーブル、インデックスを作成、彼らは何でも)成功し、その後、すべてが素晴らしいです、すべての3つのアクションが場合「ロールバック」マルチDDL移行
class XyzMigration < ActiveRecord:Migration
def change
first_action :a do ...
some_action :b do ...
other_action :c do ...
end
end
:
シナリオは私が移行を持っています。
ただし、アクションb
が失敗した場合、移行はa
を正常に実行してから停止します。今a
は、それが何であっても、行われてきたが、移行が完了していない:
問題
ここで問題があります。つまり、私が(b
の障害につながる問題を手動で修正した後で)移行を再試行すると、a
がすでに完了しているというエラーが表示され、手動でa
を元に戻す必要があります。
私が期待する何
私は移行の後者のステップが失敗した場合、すべて完了したステップを元に戻すために安全であることのRailsを伝えたい。技術的に、Railsはこれを行うことができます。なぜなら、a)元に戻すメカニズムが存在するからです(私たちはrake db:rollback
を使用して完全な移行を取り消すことができます)。b)Railsは各ステップについて、可逆であるかどうかを知っています。それで、失敗した前のすべての前のステップが可逆的であると仮定すると、元に戻すのが安全であることがわかります。
これを行うオプション、フラグ、メカニズムはありますか?私はロジックを自分自身でプログラミングすることを望んでおらず、アクションが実行される必要があるかどうかを事前にチェックすることも、例外をキャッチすることもありません。テーブルは、テーブルを作成する前に存在している場合について
MySQLを使用していますか? – denys281