【问题标题】:How to correctly deal with rails schema source control branching?如何正确处理 Rails 架构源代码控制分支?
【发布时间】:2019-12-31 00:02:58
【问题描述】:

我有一个反映主分支迁移的版本化 schema.rb。 每当我去另一个分支并在该分支中运行新的迁移时,我的数据库结构都会改变。

如果我回到 master 分支并运行 db:migrate,来自另一个分支的迁移更改将添加到架构中,尽管它不属于 master 分支。

我知道这是 Rails 的工作方式,但是你们的开发人员如何处理这个问题?

我听说有些人只是 schema:load 让本地数据库与 schema 同步,但是由于它会擦除所有数据,所以这对我来说不是一个好的解决方案,因为我使用了一个有助于开发的重型 sql 转储(这非常痛苦并且在没有这些数据的情况下容易产生风险)

【问题讨论】:

    标签: ruby-on-rails git version-control schema


    【解决方案1】:

    拥有一个用于开发的production 转储(使用浏览器/rails 服务器)很棒,但您可能应该拥有一个使用最小种子数据库的test 环境设置。

    您可以通过在空(新)数据库上执行 RAILS_ENV=test rake db:schema:load 来获得此信息。 我通常会做的事情是这样的:

    git checkout db/schema.rb
    RAILS_ENV=test rake db:reset
    RAILS_ENV=test rake db:migrate
    

    并根据需要加载固定装置。这将为您留下一个架构,该架构应该只有您的迁移更改和更改的时间戳。 (除非您将设置更改硬编码到您的架构中,在这种情况下它们会丢失 - 我们猴子补丁 ActiveRecord::SchemaDumper 以避免这种情况)。

    在您进行迁移并完成此操作后,提交schema.rb 和迁移文件,然后再将迁移应用到development。然后,您可以丢弃带有不需要更改的 schema.rb

    【讨论】:

      【解决方案2】:

      这似乎更像是一个 git 问题而不是 Rails 问题。 Git 允许使用新文件更改分支,因为它们不会与主分支或您要签出的任何分支发生冲突。在 Rails 中,创建迁移会在 db/migrations 目录中创建一个新的未跟踪文件。由于它是一个新文件,因此您可以毫无问题地签出 master 分支。

      ~/code/node/server (test)
      $ git checkout -b dev
      Switched to a new branch 'dev'
      
      ~/code/node/server (dev)
      $ touch test.txt
      
      ~/code/node/server (dev)
      $ git checkout test
      Switched to branch 'test'
      
      ~/code/node/server (test)
      $ git status
      On branch test
      Untracked files:
        (use "git add <file>..." to include in what will be committed)
      
              test.txt
      
      nothing added to commit but untracked files present (use "git add" to track)
      

      在本例中,我从分支“test”开始,然后签出一个名为“dev”的新分支。然后我创建一个测试文件并确保不要开始跟踪它。然后再次签出“测试”分支。 (注意这里没有问题)。 git status 显示未跟踪的文件跟着我回到了“测试”分支。

      如果您希望迁移文件保留在创建它的非主分支的本地,您可以执行以下操作:

      1. 您可以暂存此文件并将其提交到非主分支。执行此操作后,该文件将驻留在该分支上,并且不会跟随您回到主分支(或您决定签出的任何其他分支)。

      2. 您可以暂存此文件,然后将其存储:

        • git add path_to/your_file
        • git stash
        • 要稍后检索存储,您可以git stash pop
        • 有关 git stash 的更多信息,请阅读 here
      3. 删除文件。

      如果您不小心迁移到了您无意迁移的分支,您始终可以使用 bundle exec rake db:rollback 回滚迁移,直到您达到所需的架构状态。

      希望这会有所帮助,祝您编码愉快!

      【讨论】:

      • 您好!感谢您的回复!我可能被误解了。我的意思是具有不同迁移(以及因此不同模式)的分支迫使我们使用模式:加载以保持财务数据库结构与 dev 中的当前分支模式匹配。当我们需要处理大型生产转储时,它没有帮助,因为我们必须在 schema:load 之后再次恢复。也许使用转储开发的方法不是更好的选择,但我想知道是否有办法继续以这种方式工作
      猜你喜欢
      • 2013-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多