"down" 迁移何时有用?

When is a "down" migration useful?

短版:

down 迁移是怎么回事?在什么情况下您需要使用它?

长版:

许多支持数据库架构版本的框架(包括但不限于 Rails' "migrations")允许开发人员指定如何进行数据升级(up 操作)反向(aka down),甚至通过分析代码自动生成降级操作(如 Rails' change 方法)。

事实上,在我遇到的所有 Rails 迁移代码中,这样做似乎非常普遍,这让我想知道这是否被认为是最佳实践。

就我个人而言,我从来不需要降级数据库模式,而且我无法想象在开发或生产中我想要降级的合理场景。我的经历似乎与 down 迁移的流行不一致,所以我猜我遗漏了什么...

down 在哪些最常见的情况下有用?

所以基本上 Rails 可以在您创建像

这样的迁移时检测逆向操作
add_column => remove_column

create_table => drop_table

但是对于某些你不能真正使用更改来降级数据库架构的迁移,例如,如果你想更改小数列的精度,那么就不可能猜测到原始精度回滚?所以这种情况下需要定义down方法

实践得出的两个原因:

  • 开发环境中的代码重构 - 我们可以还原 数据库模式,重构模型&迁移然后向上迁移 再次,
  • 发送 "lemon" 到后汇总以前的应用程序版本 生产。

缺少 "down" 迁移意味着,我们根本没有迁移,我们回到了 90 年代初期从备份恢复数据库或痛苦地修改 table(s) 的信念,一切都应该顺利。

假设您已将新版本推送到生产环境并 运行 进行了迁移,一段时间后您发现了一个无法立即解决的错误。由于您需要保留生产服务器 运行ning,因此您恢复到之前的提交。但是,这不会还原对数据库所做的更改,这会导致错误。因此,您需要一种方法来回滚对数据库所做的更改,然后恢复到旧版本。这种情况可能不会经常出现,但重要的是要有它出现的机制。

在开发中,您可能会 运行 进行一些迁移,然后决定要更改、添加或删除某些内容。有办法撤消它们意味着您不需要为每个小更改创建新的迁移。