Ruby on Rails数据库部署与Gerrit

7

我正在考虑在我的下一个项目中使用Ruby on Rails。理解Rails网站的部署足够简单易懂(听起来我将使用Phusion Passenger)。

但是现在我正在尝试弄清楚数据库。我看到了很多关于“数据库迁移”的内容,这使我可以使用ruby代码更新数据库。我还看到我可以创建这些迁移的向上(up)向下(down)变体。

然而,我只能想象这在单个方向上如何干净地工作。想象一下,如果我突然说“颜色列不能为空”。因此,向上(up)将使其为必填项并给所有空值条目赋予默认值。但是向下(down)会怎么做?如果您关心它与起始状态完全相同,您不能仅将默认值设置回NULL。

对于发布到生产环境,这实际上并不重要。那可能只会在一个方向(向上)进行操作。但是,我想使用Gerrit进行代码审查,并设置机器人在允许检入之前运行构建...

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

1个回答

3

是的,你不能从新版本的代码中检出旧版本的代码并运行向下迁移。你需要在回滚到旧代码之前运行向下迁移。

有很多情况下,向下迁移实际上是不切实际或不可能的。这并不一定是坏事。这只意味着你定义了一个“无法返回的点”,你将无法将数据库恢复到早期状态。

像创建表或添加列这样的迁移可以通过简单地销毁该表或删除该列轻松地撤消。但是,如果你正在执行更复杂的操作,例如添加默认值或移动数据,那么你可以告诉Rails无法反转此迁移:

def down
  raise ActiveRecord::IrreversibleMigration
end

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


已接受的答案。我仍然不确定我将使用什么确切的策略,因为我希望构建以某种方式测试迁移。我可能会创建一个数据库快照,将其恢复到构建之前,并让迁移在其上运行。 - Johnny Kauffman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接