Joh*_*man 7 ruby database version-control ruby-on-rails
我正在考虑将Ruby on Rails用于我的下一个项目.了解rails网站的部署很容易理解(听起来我会使用Phusion Passenger)
但现在我想弄清楚数据库.我看到很多关于"数据库迁移"的内容,它允许我使用ruby代码更新数据库.我也看到,我被允许同时创建了和向下这些迁移的变种.
但是,我只能理解它如何在一个方向上干净利落地工作.想象一下,如果我突然说"颜色列不能为空".因此,up将使其成为必需并为所有NULL条目提供默认值.但是下来会做什么?如果您关心它与它的启动方式相同,则不能将默认值设置回NULL.
这对于发布到生产来说并不重要.这将有可能只是在一个方向进行(在向上方向).但是,我想使用Gerrit进行代码审查以及在允许签入之前设置机器人来运行构建...
那怎么可能呢?从一个代码审查到下一个代码审查,构建服务器将检出新的代码集,并运行迁移?但是当发生这种情况时,它甚至都不会保留以前的迁移代码,那么它如何运行下行步骤呢?作为一个更简单的例子,我看不出如何查看旧版本的代码并向后"db migrate".
是的,您无法签出旧版本的代码,然后从新版本的代码运行向下迁移。在回滚到旧代码之前,您需要运行向下迁移。
在很多很多情况下,向下迁移是不切实际或不可能的。这不一定是坏事。这只是意味着您已经定义了一个“不归路”,您将无法将数据库恢复到较早的状态。
通过简单地销毁该表或删除该列,可以轻松地逆转创建表或添加列之类的迁移。但是,如果您正在做一些更复杂的事情,例如添加默认值或移动数据,那么您可以告诉 Rails 无法逆转此迁移:
def down
raise ActiveRecord::IrreversibleMigration
end
Run Code Online (Sandbox Code Playgroud)
我建议 Gerrit 永远不要对数据库做出任何假设。每次部署新版本时,它都应该从一个新的数据库开始,并db:migrate
运行所有迁移。您可以使用像factory_girl这样的gem来使用演示数据填充您的应用程序以进行测试。