16

目前我正在使用一个巨大的 rails 应用程序和多个分支,每个分支都有这个应用程序的新功能。经常发生需要迁移的功能,在您将其与 master 合并之前这应该不是问题:schema.rb 已使用您的开发数据库的信息进行了更新!

澄清:

1. Branch A has migration create_table_x
2. Branch B has migration create_table_y
3. Branch A adds another create_table_z and runs db:migrate
4. You want to merge Branch A with Master and you see table_x, table_y and table_z in the schema.rb of Branch A.

在分支中的每次迁移之前重置+种子数据库或为每个分支创建数据库不是一个选项。由于 2 GB SQL 数据的巨大大小,它是行不通的。

我的问题:

是否真的需要将 schema.rb 保留在存储库中,因为每次迁移都会重建它?

如果是这样,是否可以从迁移而不是数据库转储中构建模式?

4

3 回答 3

11

您应该将架构保留在您的存储库中。运行迁移将为您修复 schema.rb 文件中的合并冲突。我对你的问题的简单看法

  1. 是必需的吗?不是真的,但很好的做法。

“强烈建议将此文件签入您的版本控制系统。” -schema.rb

  1. 有可能的?是的,但是您可能想问自己是否真的这样做可以节省任何时间,无论是手动还是从其他地方的迁移中构建架构并将其推入。

您将获得使用的额外好处

rake db:schema:load

rake db:schema:dump

http://tbagery.com/2010/10/24/reduce-your-rails-schema-conflicts.html

于 2013-06-18T08:13:11.847 回答
2

将 schema.rb 保存在 repo 中很重要,因为您希望新的开发人员(或您的测试环境)能够仅从 schema.rb 生成新数据库。当您进行大量迁移时,它们可能不会全部继续运行,尤其是当它们依赖于不存在、已更改或具有与迁移首次运行时不同的有效验证的模型类时。运行测试时,您希望从 schema.rb 转储并重新创建数据库,而不是每次运行完整的测试套件时都重新运行所有迁移。

如果您同时处理两个不同的功能分支,并更改两者的数据库结构,我认为 schema.rb 是您最少的问题。如果您重命名或删除分支 B 中的列,则分支 A 将在它引用旧列时中断。如果他们所做的只是创建新表,那还不错,但是您希望在从 master 合并到 A 时更新 schema.rb,以便 A 不会尝试第二次运行迁移并失败因为新表已经存在。

如果这不能回答您的问题,也许您可​​以再解释一下您的工作流程?

于 2013-05-08T15:23:27.220 回答
1

新鲜的临时数据库作为一种快速的解决方法

例如,当您db/schema.rb在特定分支上需要漂亮时,请执行以下操作:

  1. git checkout -- db/schema.rb
  2. 切换到不同的开发数据库,​​即更新config/database.yml
  3. rake db:drop && rake db:setup
  4. 耙分贝:迁移
  5. 提交你漂亮的 db/schema.rb
  6. 还原 config/database.yaml 中的更改
于 2015-05-11T20:38:47.603 回答