Rails:当您取消(ctrl + c)长时间运行的迁移时会发生什么?

时间:2012-10-23 12:49:41

标签: ruby-on-rails migration

我已经进行了几次长时间运行的迁移。就像我有一些代码部分可以更新很多记录,运行时间从几分钟到几小时。

我从未尝试取消(ctrl + c)迁移,因为我不知道迁移会发生什么。它会知道迁移取消了吗?迁移和我的应用会发生什么?如果在取消后,我会再次运行rake db:migrate?

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

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。

1 个答案:

答案 0 :(得分:0)

这取决于您使用的数据库。如果数据库支持此定义更改,Rails将使用迁移周围的事务。据我所知PostgreSQL这样做,而MySQL(至少MyISAM表)没有(但这可能已经改变)。

因此,如果您运行PostgreSQL,它应该取消该事务,并且应该可以再次运行它并获得一个干净的结果(虽然我会测试这个,但是根据更新的复杂性,事务可能会很棘手做)。 MySQL会被部分更新的记录困住,或者迁移表中的版本计数器可能不会更新,而且再次运行它会尝试再次创建新字段并失败并显示错误。