Ruby on rails 迁移创建失效的表

Ruby on rails 迁移创建失效的表,ruby-on-rails,rails-migrations,Ruby On Rails,Rails Migrations,环境 ruby 1.9.3p194(2012-04-20修订版35410)[x86_64-darwin10.8.0];轨道3.2.6;OSX 10.6.8 问题 即使在重置数据库(rake db:reset)之后,迁移也会生成错误的表、字段和模式,这些表、字段、限制、索引等都已被早期迁移规范弃用。 背景 我在两个OSX 10.6.8系统之间来回移动了一个github协作项目在上一次迁移中,通过在一次初始迁移中整合预期的表定义,重新开始了迁移(消除了以前许多迁移规范的大量混乱和费劲的处理)。

环境

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

问题

  • 即使在重置数据库(rake db:reset)之后,迁移也会生成错误的表、字段和模式,这些表、字段、限制、索引等都已被早期迁移规范弃用。
背景

  • 我在两个OSX 10.6.8系统之间来回移动了一个github协作项目在上一次迁移中,通过在一次初始迁移中整合预期的表定义,重新开始了迁移(消除了以前许多迁移规范的大量混乱和费劲的处理)。

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

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

  • 那么,以前的规定可能会保留在开发环境的某个地方,因此有必要以某种方式删除、修订或覆盖以前不再存在的定义,这些定义仍然会出现在不需要的表和字段中。

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

问题


那么,重新生成符合我们在项目中保留的迁移规范的迁移、表和模式的正确有效方法是什么?请参考以下参考:

基本上,你可以跑步

rake db:schema:load
直接从schema.rb文件加载数据库架构,但在生产中要小心,因为这会删除生产数据

通过推导以下过程,我最终能够生成符合迁移规范的模式和表:

  • 首先,我手动删除了我的schema.rb的do和final end terminator之间的所有指令,并且(无论是否重要),我进一步将版本重新定义为0:

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

  • 最后,在重新填充表之前,我运行了rake db:migrate(无论出于何种原因,我的环境拒绝在一条语句中使用前面的三个命令运行[我定期运行rake db:drop db:create db:schema:load db:fixtures:load,以重建和重新填充表])

  • 注释

    • 在试图诊断可能的影响因素时,project Searchs在我的错误模式之外的任何文件中都没有找到对不推荐使用的表或字段的引用因此,我假设由于某种原因(可能是处理错误?)错误的现有模式引用会持续存在于进一步的过程中

    • 在任何情况下,从my local schema.rb中删除所有指令后,重置和定期迁移成功地生成了一个符合迁移规范的模式,而以前的工作生成的模式错误地保留了冗余的表、字段等,因此,似乎从以前的(已失效的)本地模式一直存在。

    • 因此,如果rake db:reset显然是从一个失效的模式生成表和模式,而该模式进程没有根据现有的迁移规范重新生成,,那么这些结果(我现在已经重复了)指出db:reset中的一个逻辑缺陷――它本身应该清除先前的模式,因此,db:reset既不保留也不错误地依赖于先前模式的规范

    • 为了那些可能在编写迁移时引入自己的意外错误的人的安全,我还建议在重建合法模式之前,db:reset首先将现有(失效)模式复制到时间戳备份中,有问题的迁移可以通过依赖前一个模式的记录来纠正


    否,db:schema:load只是从错误的模式中重新创建数据库。我需要做的是重新创建一个符合我们创建的迁移的模式。不知何故,不受欢迎的孤立表定义一直存在于output schema.PS中。我看到其他注释警告在生产环境中运行db:schema:load时要“小心”。然而,我认为这种通常的谨慎是有误导性的,因为任何谨慎都无法阻止模式加载破坏生产数据,而特定的模式修订将不可避免地破坏生产数据。此外,没有理由运行这种“风险”,而是通过运行db:migrate从本质上解决了这一问题。因此,db:schema:load应该在开发和测试环境中有限制地使用,几乎毫无例外