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