【问题标题】:Is there a simple way to test a migration before running it?是否有一种简单的方法可以在运行迁移之前对其进行测试?
【发布时间】:2011-08-18 06:37:13
【问题描述】:

换句话说,我想知道确保 self.down 实际上 回滚 self.up 的最佳方法em>在运行有问题的迁移之前。

如果我需要回滚迁移,但 self.down 不起作用,我该怎么办?

在处理具有潜在破坏性的迁移时,最佳做法是什么? 只是一个数据库备份?

谢谢, 杜乔。

【问题讨论】:

  • 在生产环境中运行迁移时,您应该始终进行备份,这只是一个很好的做法,因为您永远不知道可能会出现什么问题,如果在迁移运行的中途断电会发生什么?安全总比后悔好。

标签: ruby-on-rails ruby-on-rails-3 testing rails-migrations


【解决方案1】:

您应该在不应包含实时数据的开发数据库上进行开发。因此,数据是否被破坏并不重要,因为您可以轻松地再次生成它?

如果您发现自己的开发数据很重要但并不理想,则可能适合使用数据库备份。

【讨论】:

  • 是的,我正在开发环境中进行开发。在当前的任务中,我的开发数据很重要,因为我需要它来了解 self.down 是否能够发挥作用。事实是:如果我运行 self.up,并且在之前没有进行数据库备份的情况下运行 wrong self.down,那么它会我更难修复和测试 self.down 因为初始状态(错误回滚之前的数据库)将被改变。所以我想在这种情况下值得做一个数据库备份......但我同意,理想的情况是让脚本生成的虚拟数据轻松恢复每个以前的状态。
【解决方案2】:

通常,迁移应该只包含架构更改。在这种情况下,在开发/测试环境中运行迁移应该非常安全且容易。如果出现问题,您始终可以重新创建数据库并使用一些测试数据填充它。但是,如果您要测试一些与数据相关的迁移,那么当您实际在生产环境中运行它们时,可能会出现问题。

在那种情况下,正如您提到的那样,您应该依赖数据库备份。在部署之前提供适当且快速的恢复机制。

【讨论】:

    【解决方案3】:

    为确保迁移行为符合您的要求,您应该在您的开发环境中进行试验。

    运行命令

    rake -T
    

    向您展示可用的任务,例如

    rake db:migrate
    

    rake db:rollback
    

    【讨论】:

      【解决方案4】:

      每次迁移都在一个事务中运行。记在脑子里。这意味着如果在单个迁移中出现问题,迁移将回滚(如果有任何后续,则不会执行)。

      为了测试迁移,无论是up 还是down,我都插入了很多put 语句,以检查一切是否正常,然后在我的最后一行中我提出了一个异常。这会让 rails 认为迁移失败,并且会回滚操作(就好像它从未发生过一样)。

      当我确定一切正常时,我会移除提升线,让迁移真正发挥作用。 在您的情况下,您将使用 raise 进行测试,删除 raise 并且不再运行它,我假设:)

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        • 2016-01-19
        • 2012-09-16
        • 2011-07-02
        • 2011-09-20
        相关资源
        最近更新 更多