0

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

我从未尝试取消 (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。

4

1 回答 1

0

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

因此,如果您运行 PostgreSQL,它应该取消事务,并且应该可以简单地再次运行它并获得干净的结果(尽管我会对此进行测试,但根据您所做的更新的复杂性,事务可能会很棘手)。MySQL 将被部分更新的记录卡住,或者迁移表中的版本计数器可能不会更新,并且为了再次运行它,它会尝试再次创建新字段并因错误而失败。

于 2012-10-23T13:00:41.150 回答