8

我在 git 上有几个分支,这些分支的架构在不同的版本上。切换到分支后,new_feature如果我这样做,可以说(有待迁移),rake db:setup那么它建议我运行待处理的迁移。

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

如果我这样做,rake db:reset那么它工作正常。

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

但我想知道为什么架构会显示那些删除的表rake db:migrate

我确定我缺少一些关于模式加载和迁移过程的 Rails 知识

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

4

1 回答 1

5

听起来您的 schema.rb 已签入 git,这是一件好事。因此,当您切换分支时,您的 schema.rb 与您的实际数据库架构不同。

rake db:migrate 只会检查 schema.rb 中的模式版本,如果数据库版本新,那么它将运行所有“待定”迁移。如果运行迁移,它只会重新生成 schema.rb 文件。

如果您的实际模式的版本高于 schema.rb 中报告的版本,它会做唯一安全的事情,这没什么。理由是可能没有迁移文件来更新它,或者数据库操作可能会强制重新创建表/截断或同样讨厌的东西。还有其他不匹配版本的极端情况,但我想你明白了。

因此,如果您想在分支之间保留数据,您有几个选择可以在迁移心态下工作。

A)分支之间需要的任何数据都保存在 db 种子文件中。然后您可以毫无顾虑地删除/创建您的数据库

B)在切换分支之前回滚不同的迁移。在新分支中再次将它们向前滚动。

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

和一句忠告。如果您已将其提交到 git,请不要更改旧的迁移文件。做一个新的。它们形成一个逻辑堆栈,旨在按顺序更改您的架构。

于 2013-11-08T01:24:54.227 回答