我已经进行了几次长时间运行的迁移。就像我有一些代码部分可以更新很多记录,运行时间从几分钟到几小时。
我从未尝试取消(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。
答案 0 :(得分:0)
这取决于您使用的数据库。如果数据库支持此定义更改,Rails将使用迁移周围的事务。据我所知PostgreSQL这样做,而MySQL(至少MyISAM表)没有(但这可能已经改变)。
因此,如果您运行PostgreSQL,它应该取消该事务,并且应该可以再次运行它并获得一个干净的结果(虽然我会测试这个,但是根据更新的复杂性,事务可能会很棘手做)。 MySQL会被部分更新的记录困住,或者迁移表中的版本计数器可能不会更新,而且再次运行它会尝试再次创建新字段并失败并显示错误。