0

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

假设我为具有 aname和 a的产品定义了一个数据模式price

  • 如果我创建一个迁移并添加一个名为and run的必填列,未来的产品将需要描述,但旧的产品呢?descriptiondb:migrate
  • 它们将无效,或包含空描述?
  • 我必须手动向它们添加描述吗?
  • 如果我为描述设置一个可选值怎么办?这将应用于较旧的实例吗?
  • 如果我重置所有迁移并再次运行它们,我会丢失任何数据吗?

处理这种情况的正确方法是什么?在这种情况下您会发展您的架构,可能会呈现无效的旧实例?

4

1 回答 1

0

关于您的问题:

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

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

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

如前所述,这取决于。如果您像这样迁移,那么您的新列将会有某种默认值,那么您就可以了。否则,旧条目将被设置为 NULL。

  • 我必须手动向它们添加描述吗?

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

  • 如果我为描述设置一个可选值怎么办?这将应用于较旧的实例吗?

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

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

最有可能的是,迁移可以以 UP 和 DOWN 方式构建,但在下行过程中,您会丢失可能无法根据信息丢失恢复的信息。所以删除所有迁移就像删除整个数据库。

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

处理这种情况的正确方法是什么?在这种情况下您会发展您的架构,可能会呈现无效的旧实例?

你可能会怪我,但这...取决于;)

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

于 2013-08-01T21:13:00.920 回答