使用迁移来演化数据模式的方法

时间:2013-08-01 20:28:33

标签: ruby-on-rails

我来自NodeJS背景,其中大多数框架不包括迁移支持。我有一些疑问,希望你能澄清一下:

Supose我为具有nameprice的产品定义了数据模式:

  • 如果我创建了迁移并添加了一个名为description必需列并运行db:migrate,那么未来的产品将需要说明但旧版本呢?
  • 它们无效或包含空描述?
  • 我是否必须手动添加说明?
  • 如果我为描述设置了可选值,该怎么办?这会应用于旧实例吗?
  • 如果我重置所有迁移并再次运行它们,我会丢失所有数据吗?

处理这种情况的正确方法是什么,在这种情况下你可以改进模式,可能会渲染无效的旧实例?

1 个答案:

答案 0 :(得分:0)

关于你的问题:

  • 如果我创建了一个迁移并添加了一个名为description的必需列 并运行db:migrate,未来的产品将需要描述但是 那些旧的呢?

这取决于迁移过程中发生的情况。如果您具有必需值,则应确保迁移旧模型,使其在之后也有效。如果不是,您将遇到问题,然后尝试更新旧条目,因为您的模型验证将拒绝更新尝试(如果您的更新不包括新的必填字段)

  • 它们无效或包含空描述?

如上所述,这取决于。如果你这样迁移,你的新列会有某种默认值,你没事。否则,旧条目将仅设置为NULL。

  • 我是否必须手动添加说明?

如果无法以某种方式自动生成您的值或无法应用默认值,是的。

  • 如果我为描述设置了可选值,该怎么办?这会应用于旧实例吗?

如果未在迁移中明确定义,则新列的旧条目将设置为NULL。

  • 如果我重置所有迁移并再次运行它们,我会丢失所有数据吗?

最有可能的情况是,迁移可以以UP和DOWN的方式构建,但是您正在丢失可能无法根据信息丢失恢复的信息。因此,删除所有迁移就像删除整个数据库一样。

但是为什么有人想要立即重置所有迁移?随着您的数据库不断发展,您应该将其视为一个正在成长的孩子,您将无法收回他们在教育上花费的时间,但您可以教他们表现得更好,从而忘记不必要的信息(通过进一步的UP迁移丢弃不需要的列)。

  

处理这种情况的正确方法是什么?   你进化你的架构,可能会渲染无效的旧实例吗?

你可能会怪我但是......依赖;)

如果以下更新尝试确保使模型有效,则您根本不需要关心。如果没有,您必须在迁移过程中或在某种类型的脚本或方便的尝试中再次关注它们。