7

许多人谈论数据库迁移,尤其是它的回滚可能性。

我怀疑它是否有用,因为数据库和模型的模式与应用程序逻辑(MVC)紧密相连。

假设我已经完成了一些迁移的回滚。什么?该应用程序将无法运行,因为它的逻辑完全依赖于 db。

数据库迁移回滚能力的用例是什么?


更新 1

主要问题

当我需要更改代码时,为什么将回滚作为一项功能呈现?

创建迁移,例如“add_another_field_to_table”。相反,每个迁移文件都完整描述了 DB 中的每个表。当我需要更改数据库中的某些内容时,我只需更改迁移文件,但不要回滚

真的,如果我回滚迁移,不会像版本控制那样让我及时回来。我有很多工作,当计划更改并且回滚给我任何东西时。

4

6 回答 6

10

回滚的重点是您同时回滚代码和数据库。场景是你在生产服务器上升级你的代码和数据库,然后你发现了一个错误,你真的需要回去。所以回滚你的代码并使用你的向下迁移来回滚你的数据库。

于 2010-09-27T08:13:02.310 回答
3

我发现回滚只有在本地完成时才有用,即在您处理新代码时。一旦将迁移提交到您的版本控制系统中,如果您意识到有一个错误,那么回滚迁移就不会真正起作用,因为其他开发人员会拉下迁移并运行它,所以您需要告诉他们也回滚——这太难管理了,也让你看起来无能:)

在这种情况下,最好再进行一次迁移来解决问题,然后每个人(包括您的生产服务器)都坚持使用 pull & migrate 系统。

于 2010-09-27T11:18:01.503 回答
3

向上迁移有什么意义?

  1. 您创建表结构。
  2. 您对其进行编码,它运行良好。
  3. 您将网站投入生产,每个人都很高兴。
  4. 哦,等等,他们想要一个新功能,包括向现有表中添加一列。

你怎么处理这个?您必须在开发表中添加一列,测试代码,更新实时站点,同时不要忘记更新实时数据库(因为如果这样做会出现大错误)并且还记得保留现有的实时数据。如果没有像 rails 这样好的托管解决方案,数据库管理的这一方面可能会非常痛苦。

所以 ...

  1. 编写添加一列的单行迁移代码
  2. 在 dev 副本上运行迁移,scehma.rb 将更新
  3. 编码新功能,如果您需要检查数据库架构,请使用 schema.rb 而非迁移文件。

现在你准备好发布生产....

  1. 更新生产代码
  2. 在生产环境中运行迁移。Rails 会自动计算出需要应用的内容并为您完成!

当然,随着您添加一列,您自己做也不会那么令人困惑。

但是如果有 3 个程序员都在添加迁移呢?如果您有许多实时站点,并且都具有不同的版本,该怎么办?那个 live site 2 或 17 迁移落后了吗?在保留实时数据的同时,我需要做什么才能让数据库获得最新的代码?你能看出这会很快变得令人困惑吗?

Rails 迁移(几乎每个迁移系统都按照相同的原则工作)旨在使更新数据库结构变得非常容易。非常值得正确使用。

于 2010-09-27T09:31:48.737 回答
2

不太了解您的问题,但我尝试解释一下回滚。如果要撤消相应迁移的更改,请执行回滚。这意味着数据库将被修改,并且您的 schema.rb 也将自动重新生成。当您这样做时,您可能也想删除引用代码。例如,如果您从模型中删除了一个字段,您可能不想在代码中引用该属性。如果您尝试访问,则会给​​您未定义的属性异常。而已。例如,如果您之前创建了一些模型 10 迁移,并且您想要更改某些字段,则回滚可能会变得有点麻烦。最好创建一个新的迁移并在那里修改,而不是回滚到相应的迁移。

更新 1

阅读您的更新,我认为您没有使用迁移的主要优势,即灵活性。但是您的解决方案提供了对数据库情况的更多概述。如果您喜欢这样做,我建议按顺序执行以下步骤。

  1. 回滚到相应的迁移。(例如rake db:migrate VERSION=XXX,我更喜欢rake db:rollback STEP = 2回滚 2 个迁移,STEP可选)
  2. 进行更改
  3. 迁移您的数据库以更新所有表,并获取当前迁移版本。( rake db:migrate)

此功能不会影响您的模型或其他东西,只是更改迁移文件,重新生成您的 schema.rb 并更改数据库结构,仅此而已。不能像版本控制系统那样做代码回滚,而且做这样的事情也没有意义。您必须注意不要使用已删除的字段。Rails 具有数据库字段和模型属性之间的自动映射,例如,如果您的表中有一个user_idcomment您可以将其称为模型中的属性,comment_instance.user_id.

于 2010-09-27T08:22:19.040 回答
0

rake db:migrate:redo我在处理迁移代码时和最终提交之前在本地使用迁移回滚。

于 2010-09-27T11:42:11.207 回答
0

考虑使用 capistrano 部署站点并为每个部署创建时间戳快照的场景。使用文件夹上的时间戳和您的迁移,您可以确定哪些版本的代码和架构齐头并进并执行回滚。

一个 git 存储库会给你类似的选项。

当然,真正的问题是,一旦网站的用户开始添加数据,这些数据也可能会被清除,除非您在回滚之前备份它并在以后煞费苦心地恢复它。

于 2010-09-27T09:41:23.223 回答