RAIRS:取消(CTRL C)长期运行迁移时会发生什么



我已经运行了几次长期运行的迁移。就像我有代码的某些部分更新了很多记录,并且从几分钟到几个小时运行。

我从未尝试过取消(CTRL C)迁移,因为我不知道该迁移会发生什么。它会知道迁移被取消吗?该迁移和我的应用程序会发生什么?如果取消后,我会运行Rake db:再次迁移?

会发生什么?

我的脚本之一看起来像这样:

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。

将取决于您使用的数据库。如果数据库支持此定义更改,Rails使用迁移周围的交易。据我所知

因此,如果您运行PostgreSQL,它应该取消交易,并且应该可以简单地运行它并获得干净的结果(尽管我会测试此问题,但事务可能会很棘手,具体取决于更新的复杂性做)。MySQL将被部分更新的记录陷入困境,或者可能不会更新迁移表中的版本计数器,并且为了再次运行它,它将尝试再次创建新字段并出现错误。

最新更新