swa*_*pab 8 ruby database-schema rails-migrations ruby-on-rails-3.2
我在git上有几个分支,这些分支的模式在不同的版本上.切换到分支后,new_feature如果我这样做(有挂起的迁移),rake db:setup那么建议我运行挂起的迁移.
一旦我这样做,我的模式就会更新在同一分支中删除的表.
如果我这样做rake db:reset那就行了.
我知道之间的区别db:setup和db:reset.后者一个db:drop接一个db:setup
但我想知道为什么架构显示那些丢弃的表 rake db:migrate
我肯定错过了模式加载和迁移过程中的一些rails知识
任何见解都会有很大的帮助.提前致谢
这听起来像你的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,请不要更改旧的迁移文件.只是换一个新的.它们形成一个逻辑堆栈,旨在按顺序改变您的架构.