Ale*_*lke 139

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

rake db:migrate VERSION=0
Run Code Online (Sandbox Code Playgroud)

您可以在这篇文章中看到更多信息:rake db:migrate db:reset和db:schema:load之间的区别

  • 应该选择这个答案以避免混淆. (3认同)
  • `rake db:migrate:reset`实际上并没有回滚任何迁移,这就是问题的真正要求. (2认同)

Cla*_*ani 26

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

rake db:migrate VERSION=0
Run Code Online (Sandbox Code Playgroud)

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

如果你现在发行

rake db:migrate:status
Run Code Online (Sandbox Code Playgroud)

您将看到所有迁移仍然存在,但它们处于"向下"(未应用)状态.

其他暗示a rake db:resetrake db:drop(例如@Orlando或@Alex Falke的答案)的命令根本不会进行任何回滚:也就是说,它们不会确保每次迁移都是可逆的.

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


Orl*_*ndo 13

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

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

  • 这不是问题想要做的.如果您在迁移中更改了某些内容,则不会更新架构中的更改. (9认同)