为什么 schema.rb 在我运行 db:migrate for Rails 后会更新?



我的理解是,创建迁移的人也应该更新schema.rb。由于我已经拉取了迁移,所以我也应该拉取更新的schema.rb.但是,偶尔,schema.rb在我运行bundle exec rake db:migrate后更新。

我目前的工作流程是:

  1. git pull --rebase origin master --prune

  2. rails s

  3. Rails 告诉我迁移

  4. bundle exec rake db:migrate

  5. 实现schema.rb更新

在这一点上,我很确定我不应该签入更新的schema.rb。我会通过git checkout origin/master db/schema.rb手动还原它.

那么在这种情况下出了什么问题呢?同事在创建迁移后是否忘记运行迁移?我做错了什么吗?

据我所知,运行rails db:migrate 后模式可能会更改,因为:

  1. 同事没有提交 schema.rb,因此当您获取并运行迁移时,您会得到差异
  2. 本地计算机上正在运行不同的数据库版本。基于数据库的配置架构可能会相应地更改。

运行 git diff 将帮助您了解正在发生的事情。

schema.rb保留了两组关键数据:

  1. 应用数据库结构中所有表的说明
  2. 已应用的所有迁移的列表。

如果有新开发人员加入您的团队,他们应该能够运行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(,则上述所有内容也适用。

相关内容

  • 没有找到相关文章

最新更新