0

長時間の移行をすでに数回実行しました。かなり多くのレコードを更新し、数分から数時間実行するコードの一部があるように。

移行がどうなるかわからないので、移行をキャンセル (ctrl+c) しようとしたことはありません。移行がキャンセルされたことを認識できますか? その移行と私のアプリはどうなりますか? キャンセルした後に rake db:migrate を再度実行するとどうなりますか?

私のスクリプトの1つは次のようになります。

def up
  add_column :foo, :bar, :string

  Foo.all.each do |f|
    f.bar = if f.x
      'foo'
    else
      'bar'
    end

    f.save
  end

  remove_column :foo, :something
end

def down
  * reverse of up
end

私もpostgresを使用しています。

4

1 に答える 1

0

それは、使用するデータベースによって異なります。データベースが定義変更のためにこれをサポートしている場合、Rails は移行の前後でトランザクションを使用します。私の知る限り、PostgreSQL はこれを行いますが、MySQL (少なくとも MyISAM テーブル) は行いません (ただし、これは変更されている可能性があります)。

したがって、PostgreSQL を実行すると、トランザクションがキャンセルされ、単純に再実行してクリーンな結果を得ることができるはずです (これをテストしますが、実行する更新の複雑さによっては、トランザクションがトリッキーになる可能性があります)。MySQL は部分的に更新されたレコードでスタックするか、移行テーブルのバージョン カウンターが更新されず、再度実行するために新しいフィールドを再度作成しようとして失敗し、エラーが発生します。

于 2012-10-23T13:00:41.150 に答える