迁移创建已解散的表

时间:2012-09-09 18:03:32

标签: ruby-on-rails rails-migrations

环境

ruby​​ 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0]; Rails 3.2.6; OSX 10.6.8

问题

  • 即使在重置数据库(rake db:reset)之后,迁移也会生成错误的表,字段和模式,其中包含早期迁移规范已弃用的表,字段,限制,索引等。 /强>

背景

  • 我在两个OSX 10.6.8系统之间来回移动了一个github合作项目。 在之前的时刻,通过在单个初始迁移中整合预期的表定义(从消除了许多先前迁移规范的实质性混淆和费力处理),从头开始重新开始迁移。

  • 几个月来,修订后的迁移都忠实地生成了表格和模式。

  • 在从便携式系统同步公共存储库后将项目拉到我的主要开发系统后,进一步的迁移会保留许多表和字段,实际上这些表和字段在任何现有迁移中都没有定义,并且这些都不是由其他协作者的开发环境中的相同迁移生成的。换句话说,许多已废弃/已弃用的字段和表格在某些方面仍然存在,这些规范早在我们修订的迁移中删除之前就已存在。 因此,即使在运行rake db:reset之后,db:migrate也会在这一个系统上生成错误的表和模式。

  • 据推测,之前的处方会保留在开发环境的某个地方,并且有必要以某种方式删除,修改或覆盖先前的,不再存在的定义,这些定义仍然存在于不受欢迎的表格和字段。

  • 在纠正这个问题时,被迫取消现有工作是非常不可取的。

问题

重新生成迁移,表格和模式的正确有效方法是什么,它们忠实于我们在项目中保留的迁移规范?

2 个答案:

答案 0 :(得分:0)

请参考以下参考资料:

基本上,你可以运行

rake db:schema:load

直接从schema.rb文件加载数据库模式,但要小心这样做,因为这可能会删除您的生产数据

答案 1 :(得分:0)

<强> FIX

通过推导以下过程,我终于能够生成与我们的迁移规范一致的模式和表:

  1. 首先,我手动删除了schema.rb的do和final end终结符之间的所有指令,以及(无论是否重要)我进一步重新定义了版本为0:

    ActiveRecord::Schema.define(:version => 0) do  
    end
    
  2. 接下来,我运行 rake db:drop db:create db:reset (首先删除表,只是为了消除工件可能从SQL引擎进程中持续存在的任何可能性。)

  3. 最后,在重新填充表之前,我运行了 rake db:migrate (由于某种原因,我的环境拒绝在单个语句中使用前面的三个命令运行[I]定期运行 rake db:drop db:create db:schema:load db:fixtures:load 来重建和重新填充表格,例如]。)

  4. 备注

    • 在尝试诊断可能的影响因素时,项目搜索在我的错误架构以外的任何文件中都发现绝对没有引用已弃用的表或字段。 因此我推测由于某种原因(可能是处理错误?)错误的现有架构引用在持续进程中持续存在

    • 在任何情况下,在从我的本地schema.rb中删除所有指令后,重置和常规迁移成功生成了一个确实 忠实 的模式我们的迁移规范,,而之前的努力产生的模式错误地保留了多余的表,字段等,这确实似乎已经从前(已解散)的本地模式中持续存在。

    • 因此,如果 rake db:reset 显然正在根据现有的迁移规范,已根据现有迁移规范重建的已解散模式生成表和模式, strong>然后这些结果(我现在反复重复)表明db:reset中的逻辑缺陷 - 应该本身清除先前的模式,因此,db:reset既不保留也不依赖于前架构的规范。

    • 为了在编写迁移时可能会引入自己的无意错误的人的安全,我还建议在重构合法模式之前,db:reset首先将现有(已解散)模式复制到带时间戳的备份,有问题的迁移可以通过可能必要的依赖于前一个模式的记录来纠正。