55

是否有适用于所有迁移的快速 rake db:rollback 命令?

4

4 回答 4

165

回滚所有迁移

要回滚所有迁移,最好的解决方案是@Claudio Floreani 提出的解决方案:

rake db:migrate VERSION=0

这将回滚每次迁移。您可以在他的回答中阅读为什么这是最好的方法。然后,再次运行所有迁移

rake db:migrate

重置数据库

重置

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

此方法删除数据库并再次运行迁移。

加载最后一个模式

rake db:reset

此方法将删除数据库并从最后一个模式加载数据。

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

感谢@Claudio Floreani 和所有评论以改进答案的用户。

于 2013-04-24T12:46:06.650 回答
29

如果您真的想回滚所有迁移,而不仅仅是将数据库带到原始状态或最后一个模式,您必须运行:

rake db:migrate VERSION=0

这实际上会在每次迁移中一直回滚,并确保每次迁移都是可逆的。

如果你现在发出

rake db:migrate:status

您会看到所有迁移仍然存在,但它们处于“关闭”(未应用)状态。

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

此外,rake db:drop不能在其他用户访问数据库时运行,而可以实时执行回滚(即使通常不推荐这样做)。最后但同样重要的是,简单地删除并重新创建数据库也会删除架构迁移表:如果有人在删除rake db:migrate:status数据库后运行,他将被回答“架构迁移表尚不存在”并且不会有任何线索可以应用哪些迁移(除非他还知道或可以列出它们)。

于 2015-08-27T15:01:50.023 回答
16

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

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

于 2013-04-24T12:25:14.187 回答
0

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

这让我可以做到

rails db:migrate

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

于 2018-10-11T15:47:01.457 回答