如何解决Rails与db / structure.sql

时间:2017-05-26 18:06:21

标签: ruby-on-rails database migration merge-conflict-resolution

有人告诉我,如果在我的分支中进行新迁移并且在db/structure.sql文件中与master发生合并冲突,我应该按照以下步骤操作。

  1. 在分支中,bundle exec rake db:drop
  2. 在分支中,bundle exec rake db:create
  3. 在主人,bundle exec rake db:structure:load
  4. 在分支中,git merge master
  5. 在分支中,bundle exec rake db:migrate
  6. 如果我想要做的就是对齐db/structure.sql文件,那么步骤1-3需要什么?通过合并到主人,我没有得到我尚未运行的新迁移,然后通过运行它们,它将更新我的db/structure.sql

2 个答案:

答案 0 :(得分:3)

你是对的,删除并重新创建数据库以解决db/structure.sql(或db/schema.rb中的冲突)是有点荒谬的。您应该能够简单地运行新的迁移并从structure.sql获取更新的db:migrate

db/stucture.sql文件只是数据库看到的数据库结构(而db/schema.rb是ActiveRecord在其有限视图中的数据库结构)。如果structure.sql中存在冲突,则仅表示:

  1. 合并涉及更改数据库结构的新迁移。
  2. 您合并的分支机构以不同的顺序运行迁移,因此即使模式在功能上等效,模式也不会完全匹配。
  3. (1)是通过运行新迁移并可能修复迁移本身存在冲突的任何地方来解决的。快速bin/rake db:migrate应解决此问题,并为您留下新的非冲突db/structure.sql

    (2)以同样的方式解决。您也可以执行手动bin/rake db:structure:dump来重建db/structure.sql,但只有在您确定自己确实遇到这种情况时才会这样做;但实际上,db:migrate会照顾它,所以没有理由不仅仅db:migrate

    db/structure.sql(或db/schema.rb)中的冲突并不表示db/structure.sql本身存在问题,它们表明数据库出现问题 git 无法直接看到。冲突的解决方案是修复数据库。

答案 1 :(得分:0)

您只需运行bundle exec rake db:structure:dump即可重新生成db / structure.sql文件。

对于schema.rb,我发现了https://stackoverflow.com/a/3815807/6003161