我已经运行了几次长期运行的迁移。就像我有代码的某些部分更新了很多记录,并且从几分钟到几个小时运行。
我从未尝试过取消(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将被部分更新的记录陷入困境,或者可能不会更新迁移表中的版本计数器,并且为了再次运行它,它将尝试再次创建新字段并出现错误。