rake db:使用删除的表迁移更新schema.rb

时间:2013-10-16 14:59:25

标签: ruby ruby-on-rails-3.2 database-schema rails-migrations

我在git上有几个分支,这些分支的模式在不同的版本上。 切换到分支后,如果我new_feature,请说rake db:setup(有挂起的迁移),然后建议我运行挂起的迁移。

一旦我这样做,我的架构就会更新在同一分支中删除的表。

如果我rake db:reset,那么它可以正常工作。

我知道db:setupdb:reset之间的区别。 后一个会db:drop然后db:setup

但我想知道为什么架构会在rake db:migrate

上显示那些已删除的表格

我肯定错过了一些铁路知识w.r.t.架构加载和迁移过程

任何见解都会有很大的帮助。提前致谢

1 个答案:

答案 0 :(得分:5)

听起来你的schema.rb被检入git,这是一件好事。因此,当您切换分支时,schema.rb与实际的db模式不同。

rake db:migrate只会检查schema.rb中的架构版本,如果数据库版本更年轻,它将运行所有“挂起”迁移。如果运行迁移,它仅重新生成schema.rb文件。

如果您的实际架构的版本高于schema.rb中报告的版本,则它是唯一安全的东西,这没什么。基本原理是可能没有迁移文件来使其更新,或者数据库操作可能会强制重新创建表/截断或同样令人讨厌的东西。还有其他不匹配版本的边缘情况,但我认为你明白了。

如果您想在分支机构之间保留数据,那么您有一些选项可以用于迁移心态。

A)分支之间需要的任何数据都保存在db种子文件中。然后你可以放弃/创建你的数据库而不用担心

B)在切换分支之前回滚不同的迁移。在新的分支中,他们再次前进。

C)作弊,删除schema.rb并重新运行rake db:migrate。这是作弊,因为它可能很容易导致数据锁,版本控制中的schema.rb不一致,以及其他团队成员的头痛,因为您的迁移没有任何意义。

并提出建议。如果您已将其提交到git,请不要更改旧的迁移文件。只是换一个新的。它们形成一个逻辑堆栈,旨在按顺序改变您的架构。