在我的公司,我们看到字段出现/消失、出现错误表以及schema.rb
文件中冲突的间歇性问题。这些问题一直在发生,浪费了我们的时间。
我很难让我的同事相信我们的迁移/schema.rb
问题可以通过使用标准工作流程来解决。
首先,事实:
- 我们
schema.rb
有源代码控制 - 我们知道这
schema.rb
应该是我们数据库的最终事实来源 - 我们在生产/QA 中使用 SqlServer,在开发/测试中使用 Postgresql
- 这意味着我们实际上有两个
schema.rb
文件:一个用于 SqlServer,一个用于 Postgresql。 - 我们当前的
schema.rb
文件与我们的生产数据库不同步,因为我们允许开发人员通过本地更改来污染它。
我相信(大部分)我们的迁移/schema.rb
问题将通过遵循这个简单的规则来解决:
在运行迁移之前,请始终将架构加载到新创建的数据库中:
rake db:drop db:create db:schema:load db:migrate
然后,仔细检查您的更改,以确保只有迁移中的更改被提交到 schema.rb
我的同事认为最好不要让开发人员更改schema.rb
,而是在我们的 Jenkins 服务器上设置一个任务,该任务将运行迁移并自动提交更改到schema.rb
. 他说我们应该从我们的流程中去除人为因素,并使工作自动化,这不会让未来发生问题。
虽然我相信自动化工作,但我不认为这是最好的解决方案,因为它只是针对症状而不是原因。自动化 git 提交让我很紧张,因为很多事情都可能出错。更重要的是,分离迁移及其相应的schema.rb
变化对我来说似乎是一个非常糟糕的主意。我们不应该继续让我们的开发人员忽视污染的负面影响schema.rb
。相反,我们应该教他们一个更好的工作流程,避免污染schema.rb
,并让他们知道在将来发生问题时调试问题。
人们可以权衡并推荐我们的哪种解决方案更好吗?还是我们还没有想到的更好的解决方案?