0

环境

红宝石 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 之后也是如此。

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

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

问题

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

4

2 回答 2

0

请参考这些参考资料:

基本上,你可以运行

rake db:schema:load

直接从 schema.rb 文件加载你的数据库模式,但是在生产环境中这样做要小心,因为这会删除你的生产数据

于 2012-09-09T18:09:35.840 回答
0

使固定

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

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

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

  3. 最后,在重新填充我们的表之前,我运行了rake db:migrate(无论出于何种原因,我的环境拒绝在单个语句中使用前面三个命令运行 [我经常运行rake db:drop db:create db:schema :load db:fixtures:load例如重建和重新填充表])。

笔记

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

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

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

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

于 2012-09-10T04:06:40.370 回答