我遇到了一个问题,我在rails项目上的两个分支上工作,每个项目都有一个迁移来添加一个列。当时,rake db:migrate:reset
会导致问题,我完全依赖schema.rb
来正确表示数据库的状态。有一次,我遇到了一个问题,即分支A添加的列进入了分支B的模式。由于migrate:reset
不是一个选项,我使用手动编辑模式文件。我提交了这个基本上删除分支A中的列的更改,我在分支B的schema.rb中不需要。
在将分支A合并到主服务器之后出现了问题。当我尝试将分支B重新命名为master时,我仍然在B中进行了提交以删除模式文件中的列(现在已经变得相关,因为它在master中)。 Git没有看到这方面的冲突并自动合并它。在我的rebase结束时,我发现我的模式与我在主人身上的模式不一致。
我的修复方法是再次编辑模式文件,然后手动将先前删除的列添加回模式文件。我的问题是:这被认为是非传统的吗?危险吗?哈克?
现在它涉及一列但如果这涉及多列删除/添加(危险?)解决方案可能导致更多问题和db / schema.rb不一致。
答案 0 :(得分:7)
编辑schema.rb
文件通常被认为是不好的做法。
每次运行新迁移时迁移(尽管可能很强大)不是数据库架构的权威来源。该角色属于db / schema.rb或Active Record通过检查数据库生成的SQL文件。它们不是为了编辑而设计的,它们只代表数据库的当前状态。
schema.rb
都会更新 :
请注意,运行db:migrate还会调用db:schema:dump任务,该任务将更新db / schema.rb文件以匹配数据库的结构。
我建议您花一些时间来解决问题,让schema.rb
文件回到正轨并更正最新的迁移集。