7

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

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

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

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

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

4

1 回答 1

3

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

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

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

def down
  raise ActiveRecord::IrreversibleMigration
end

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

于 2012-10-26T22:29:28.100 回答