代码之家  ›  专栏  ›  技术社区  ›  Stéphan Kochen

我为什么要恢复迁移?

  •  5
  • Stéphan Kochen  · 技术社区  · 15 年前

    down 默认情况下用于恢复迁移的方法。但是,在什么情况下,我会希望恢复迁移?

    一些想法:

    无论是在开发阶段还是在生产阶段,在运行迁移之前,我总是要返回数据库的快照。特别是对于执行数据转换的迁移,我发现在大多数情况下,恢复快照甚至比恢复迁移更快(所以我决不会仓促行事!)

    • 在非事务性数据库上出现异常时失败,从而使数据库中断,或者

    如果所做的更改是在生产中(或在开发后期),并且后来证明是错误的,我会在新的迁移中修复我的错误。我会的 恢复旧的。在开发中,我只需删除迁移。

    我还发现down方法引入了额外的代码,我在其中重复自己,因此可能会引入新的bug。这是违反干燥原则的。

    所以我对专业人士很好奇,因为我想不出任何专业人士。

    4 回复  |  直到 15 年前
        1
  •  4
  •   Larry K    15 年前

    在开发中,通过自动使用down方法,可以轻松快速地增量“改进”迁移。如

    1. 创建迁移并迁移到它
    2. 在新迁移之前,使用db:Migrate with a version迁移到版本
    3. 改进/修复您的迁移

    你拍摄快照的方法很好。但是rails使用“向下”迁移技术自动实现了同样的效果。适用于所有db,味道很棒

    对于生产,我同意不需要向下迁移。但有时会发生错误,你需要后退。向下迁移路径为您提供了第一个快速的机会,可以在升级出错时在紧急情况下修复问题。

    --在紧急情况下尝试向下迁移要比使用检查点恢复数据库快得多。

        2
  •  2
  •   Mike Trpcic    15 年前

    它们适用于以下情况:

    现在,如果迁移深度为10或15次,只编写一个新的迁移会更容易,而不是通过回滚丢失新表/列中的所有开发数据。但是,如果您刚刚编写了迁移,那么回滚、更改迁移并重新运行迁移会更干净、更整洁。

    回滚的另一个非常有用的功能是:

    • 开发人员1有自己的开发数据库。他编写并运行迁移。
    • 开发人员2有自己的开发数据库。她编写并运行迁移。
    • 开发者2源代码管理更新
    • 从技术上讲 已经运行了。现在,她需要回滚,然后执行db:migrate以获取本地数据库中的所有迁移。
        3
  •  2
  •   Hardryv    15 年前

    在生产中进行向下迁移的想法让我感到恐惧。当回滚所有迁移的首选方法是 rake db:migrate VERSION=0

      def self.down
        if Rails.env.production?
          raise ActiveRecord::IrreversibleMigration
        else
          drop_table :foo_bars
        end 
      end 
    

        4
  •  0
  •   nanda    15 年前