我应该如何管理数据库修订和代码库修订?
How am I supposed to manage db revisions alongside codebase revisions?
我们有一个带有 PostgreSQL 数据库的 Rails 应用程序。我们使用 git
进行版本控制。
这个项目我们只有两个开发人员,所以我们每个人都要做一点点事情,当出现紧急情况时,我们常常不得不抛下一切去解决。
我们有一个主要分支(称为 staging
只是为了困难),我们仅直接将其用于快速修复、较小的副本更改等。对于更大的功能,我们在独立的功能分支上工作。
当我处理需要更改数据库的功能时,我自然必须创建更改模式的迁移。假设我正在处理 feature-emoji
,并且我创建了一个迁移 20150706101741_add_emoji_to_users.rb
。我 运行 rake db:migrate
继续我的工作。
后来,我被告知我需要解决一些错误。我切换到 staging
开始工作;但是,现在我的应用程序会出现异常,因为数据库模式与应用程序的预期不匹配。所以在做git checkout staging
之前,我必须记得做rake db:rollback
。然后当我切换回 feature-emoji
时,我必须再次 运行 rake db:migrate
。
当只处理两个分支时,整个流程还算可以,但是当 git rebase
s 和 git merge
s 发生时,它就变得复杂了。
有没有更好的方法来并行处理代码和数据库的版本控制?还是我注定每次要更改分支时都必须 运行 烦人的 rake
任务?
这个问题没有简单的答案。您也许可以设置类似 git 挂钩的东西来检查对 schema.rb
的更改,如果存在则检查失败;但是在这样的设置中有很多边缘情况需要检查。
最终,人类开发人员有责任恢复他们环境中未跟踪的部分——例如数据库 — 在切换分支之前处于干净状态。
我们有一个带有 PostgreSQL 数据库的 Rails 应用程序。我们使用 git
进行版本控制。
这个项目我们只有两个开发人员,所以我们每个人都要做一点点事情,当出现紧急情况时,我们常常不得不抛下一切去解决。
我们有一个主要分支(称为 staging
只是为了困难),我们仅直接将其用于快速修复、较小的副本更改等。对于更大的功能,我们在独立的功能分支上工作。
当我处理需要更改数据库的功能时,我自然必须创建更改模式的迁移。假设我正在处理 feature-emoji
,并且我创建了一个迁移 20150706101741_add_emoji_to_users.rb
。我 运行 rake db:migrate
继续我的工作。
后来,我被告知我需要解决一些错误。我切换到 staging
开始工作;但是,现在我的应用程序会出现异常,因为数据库模式与应用程序的预期不匹配。所以在做git checkout staging
之前,我必须记得做rake db:rollback
。然后当我切换回 feature-emoji
时,我必须再次 运行 rake db:migrate
。
当只处理两个分支时,整个流程还算可以,但是当 git rebase
s 和 git merge
s 发生时,它就变得复杂了。
有没有更好的方法来并行处理代码和数据库的版本控制?还是我注定每次要更改分支时都必须 运行 烦人的 rake
任务?
这个问题没有简单的答案。您也许可以设置类似 git 挂钩的东西来检查对 schema.rb
的更改,如果存在则检查失败;但是在这样的设置中有很多边缘情况需要检查。
最终,人类开发人员有责任恢复他们环境中未跟踪的部分——例如数据库 — 在切换分支之前处于干净状态。