【问题标题】:Rake db:migrate - how do I undo all migrations and redo themRake db:migrate - 我如何撤消所有迁移并重做它们
【发布时间】:2013-04-17 23:51:30
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    回滚所有迁移

    要回滚所有迁移,最好的解决方案是@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 实际上并没有回滚任何迁移,这才是问题真正要问的。
    • 谢谢!我在任何地方都找不到这个答案
    • 警告:这将DROP您的数据库。
    • Claudio Floreani 的回答和这个回答一样正确。在 Heroku 等服务上,您无权删除数据库,如果您编辑迁移,真正回滚可能是您唯一的选择。
    【解决方案2】:

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

    rake db:migrate VERSION=0
    

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

    如果你现在发出

    rake db:migrate:status
    

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

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

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

    【讨论】:

    • 这是最正确的答案!其他解决方案(例如 db:reset)将破坏数据。 Rails 应用程序完全有可能是在预先存在的数据库上构建的,因此迁移不会描述整个数据库。重置数据库会丢失预先存在的数据以及旧架构本身。
    【解决方案3】:

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

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

    【讨论】:

    • 这不是问题想要做的。如果您在迁移中更改某些内容,它不会更新架构中的更改。
    • @Alex Falke 得到了这个问题的正确答案。
    • 这不会回答 OP 的问题并且会破坏数据。这会删除数据库(并再次构建它......),这与回滚所有迁移有很大不同。 @ClaudioFloreani 在下面更准确地回答:rake db:migrate VERSION=0
    • @DavidHempy 我认为您正在假设 OP 想要什么,您在下面的评论中描述的内容(处理 Rails 外部数据模式的应用程序)是一个边缘案例。这更面向开发,因为您不应该在生产数据库中运行回滚(如果您删除一个字段,它也会删除该字段的数据)。在大多数情况下,人们只是想恢复数据库,因为他们在开发过程中犯了一个错误,这种做法是可以的。
    • OP 在她的问题中完全明确。
    【解决方案4】:

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

    这让我可以这样做

    rails db:migrate
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 2017-02-05
      • 2017-01-07
      • 1970-01-01
      • 2013-10-03
      • 2014-06-20
      • 2010-09-09
      相关资源
      最近更新 更多