【发布时间】:2013-04-17 23:51:30
【问题描述】:
是否有适用于所有迁移的快速 rake db:rollback 命令?
【问题讨论】:
标签: ruby-on-rails database ruby-on-rails-3 migration
是否有适用于所有迁移的快速 rake db:rollback 命令?
【问题讨论】:
标签: ruby-on-rails database ruby-on-rails-3 migration
要回滚所有迁移,最好的解决方案是@Claudio Floreani 提出的解决方案:
rake db:migrate VERSION=0
这将回滚每次迁移。您可以在his answer 中了解为什么这是最好的方法。然后,再次运行所有迁移
rake db:migrate
rake db:migrate:reset #runs db:drop db:create db:migrate
此方法删除数据库并再次运行迁移。
rake db:reset
此方法将删除数据库并从最后一个模式加载数据。
您可以在这篇文章中看到更多信息:Difference between rake db:migrate db:reset and db:schema:load
感谢@Claudio Floreani 和所有评论以改进答案的用户。
【讨论】:
rake db:migrate:reset 实际上并没有回滚任何迁移,这才是问题真正要问的。
如果您真的想回滚所有迁移,而不仅仅是将数据库恢复到原始状态或最后一个架构,则必须运行:
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
一切正常。当然,您会丢失所有数据!
【讨论】: