我的理解是,创建迁移的人也应该更新schema.rb
。由于我已经拉取了迁移,所以我也应该拉取更新的schema.rb
.但是,偶尔,schema.rb
在我运行bundle exec rake db:migrate
后更新。
我目前的工作流程是:
-
git pull --rebase origin master --prune
-
rails s
-
Rails 告诉我迁移
-
bundle exec rake db:migrate
-
实现
schema.rb
更新
在这一点上,我很确定我不应该签入更新的schema.rb
。我会通过git checkout origin/master db/schema.rb
手动还原它.
那么在这种情况下出了什么问题呢?同事在创建迁移后是否忘记运行迁移?我做错了什么吗?
据我所知,运行rails db:migrate 后模式可能会更改,因为:
- 同事没有提交 schema.rb,因此当您获取并运行迁移时,您会得到差异
- 本地计算机上正在运行不同的数据库版本。基于数据库的配置架构可能会相应地更改。
运行 git diff 将帮助您了解正在发生的事情。
schema.rb
保留了两组关键数据:
- 应用数据库结构中所有表的说明
- 已应用的所有迁移的列表。
如果有新开发人员加入您的团队,他们应该能够运行rake db:schema:load
并立即获得最新的数据库结构。这比期望他们手动运行所有迁移要高效、可靠得多。
运行rake db:migrate
,即使没有需要运行的未完成迁移,也始终会重新生成db/schema.rb
。大多数情况下,您不会注意到,因为文件将是相同的 - 但您可能会在空格格式或列顺序上有所不同。
最佳做法(恕我直言(应始终是在与添加的任何迁移相同的提交中签入更新的db/schema.rb
。
将分支提取或拉取到本地计算机时,运行rake db:migrate
将根据本地数据库schema_migrations
表中的记录应用需要运行的任何新迁移。之后,您的新db/schema.rb
应该与您拉下的相同 - 但如果不是,git diff
会告诉您有什么区别。
然后,您可以判断最佳行动方案是什么。如果唯一的区别是外观上的,我个人倾向于还原未暂存的更改,并在下一次迁移之前保持提交的版本不变。
如果您通过在config/application.rb
中指定config.active_record.schema_format = :sql
切换到基于 SQL 的结构文件 (db/structure.sql
(,则上述所有内容也适用。