Rake db:migrate - 如何撤消所有迁移并重做它们

时间:2013-04-24 12:16:04

标签: ruby-on-rails database ruby-on-rails-3 migration

是否有针对所有迁移的快速rake db:rollback命令?

4 个答案:

答案 0 :(得分:127)

虽然@Orlandos的回复是正确的,但rake db:reset不会重做所有迁移,并且正如他所说,从最后一个模式加载数据。 如果要撤消所有迁移,然后重做它们,则应使用:

rake db:migrate:reset #runs db:drop db:create db:migrate

您可以在此信息中查看更多信息:Difference between rake db:migrate db:reset and db:schema:load

答案 1 :(得分:23)

如果您确实想回滚所有迁移,而不仅仅是将数据库置于原始状态或最后一个架构,则必须运行:

rake db:migrate VERSION=0

这实际上会在每次迁移时完全回滚,并确保每次迁移都是可逆的。

如果您现在发出

rake db:migrate:status

你会发现所有的迁移仍然存在,但是他们正处于“倒下”的状态。 (未申请)州。

暗示rake db:resetrake db:drop的其他命令(例如@Orlando或@Alex Falke的答案)根本不会做任何回滚:也就是说,他们赢了# 39;确保每次迁移都是可逆的。

此外,在其他用户访问数据库时,rake db:drop无法运行,而回滚可以实时执行(即使通常不建议这样做)。最后但并非最不重要的是,简单地删除和重新创建数据库也将删除模式迁移表:如果有人在数据库被删除后运行rake db:migrate:status,他将回复"模式迁移表不存在然而"并且没有关于可以应用哪些迁移的线索(除非他现在知道或可以列出它们)。

答案 2 :(得分:14)

只需使用rake db:reset即可删除数据库(与撤消所有迁移相同)并重置为最后一个模式。

更新:更正确的方法是使用rake db:migrate:reset。这将删除数据库,再次创建它并运行所有迁移,而不是重置为最新的模式。

答案 3 :(得分:0)

如果出现权限问题(就像我发生的那样),也许您可​​以尝试删除所有数据库表,就像我对rubymine所做的一样(只需打开数据库工具窗口,选择所有表并单击鼠标右键-> drop),它应该与其他IDE类似。在删除操作中方便地忽略了诸如sqlite_master和sqlite_sequence之类的表。

这允许我做

rails db:migrate

,一切正常。当然,您会丢失所有数据!