是否有适用于所有迁移的快速 rake db:rollback 命令?
4 回答
回滚所有迁移
要回滚所有迁移,最好的解决方案是@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 和所有评论以改进答案的用户。
如果您真的想回滚所有迁移,而不仅仅是将数据库带到原始状态或最后一个模式,您必须运行:
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
数据库后运行,他将被回答“架构迁移表尚不存在”并且不会有任何线索可以应用哪些迁移(除非他还知道或可以列出它们)。
只需使用rake db:reset
,这将删除您的数据库(与撤消所有迁移相同)并重置为最后一个模式。
更新:将使用更正确的方法rake db:migrate:reset
。这将删除数据库,再次创建它并运行所有迁移,而不是重置为最新模式。
如果出现权限问题(就像我发生的那样),也许您可以尝试像我对 rubymine 所做的那样删除所有数据库表(只需打开数据库工具窗口,选择所有表并右键单击 -> 删除),它应该类似于其他 IDE。一些表,如 sqlite_master 和 sqlite_sequence 在 drop 中被方便地忽略了。
这让我可以做到
rails db:migrate
一切正常。当然,您会丢失所有数据!