【问题标题】:Ruby on Rails Database Deployment with Gerrit使用 Gerrit 部署 Ruby on Rails 数据库
【发布时间】:2012-10-26 22:07:59
【问题描述】:

我正在考虑在我的下一个项目中使用 Ruby on Rails。了解 Rails 网站的部署很容易理解(听起来我将使用Phusion Passenger

但现在我正在尝试找出数据库。我看到了很多关于“数据库迁移”的信息,它允许我使用 ruby​​ 代码更新数据库。我还看到我被允许创建这些迁移的 updown 变体。

但是,我只能理解它是如何在一个方向上干净利落地工作的。想象一下,如果我突然说“颜色列不能为空”。因此,up 将使其成为必需项,并为所有 NULL 条目提供默认值。但是down会做什么呢?如果您关心它与开始时的方式相同,则不能将默认值设置回 NULL。

这对于发布到生产来说并不重要。这很可能只在一个方向上完成(在向上方向)。 但是,我想使用 Gerrit 进行代码审查以及设置机器人以在允许签入之前运行构建...

那怎么可能呢?从一个代码审查到下一个,构建服务器将检查新的代码集并运行迁移?但是当这种情况发生时,它甚至不会保留之前的迁移代码,那么它如何运行 down 步骤呢?作为一个更简单的例子,我看不出如何检查旧版本的代码并向后“db migrate”。

【问题讨论】:

    标签: ruby-on-rails ruby database version-control


    【解决方案1】:

    是的,您不能签出旧版本的代码,然后从新版本的代码运行向下迁移。在回滚到旧代码之前,您需要运行向下迁移。

    在很多情况下,向下迁移是不切实际或不可能的。这不一定是坏事。这只是意味着您已经定义了一个“不归路点”,您将无法将数据库恢复到之前的状态。

    只需销毁该表或删除该列即可轻松逆转创建表或添加列等迁移。但是,如果您正在做一些更复杂的事情,例如添加默认值或移动数据,那么您可以告诉 Rails 无法逆转这种迁移:

    def down
      raise ActiveRecord::IrreversibleMigration
    end
    

    我建议 Gerrit 永远不要对数据库做任何假设。每次部署新版本时,它都应该从一个新数据库开始,然后运行 ​​db:migrate 来运行所有迁移。您可以使用 factory_girl 之类的 gem 来为您的应用填充演示数据以进行测试。

    【讨论】:

    • 接受的答案。我仍然不确定我将使用什么确切的策略,因为我希望构建以某种方式测试迁移。我可能会制作一个在构建之前恢复到的数据库快照,并让迁移在其上运行。
    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 2015-01-28
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2013-05-25
    相关资源
    最近更新 更多