【问题标题】:rake db:migrate not working, no errorsrake db:migrate 不工作,没有错误
【发布时间】:2014-05-09 23:26:09
【问题描述】:

我正在尝试运行 rake db:migrate 以删除一些列并添加其他一些列。 这是我正在尝试运行的迁移:

     class Demographics < ActiveRecord::Migration
        def change
    change_table :demographics do |t|
    t.remove_column :demographics, :race
    t.remove_column :demographics, :other_race
    t.integer :race_id
    t.integer :other_race_id
    t.remove :demographics, :education
    t.integer :education_id

    t.remove :other_education
    t.integer :other_education_id

end
end
end

这里是输出:rake db:migrate status --trace

    ** Invoke db:migrate (first_time)
    ** Invoke environment (first_time)
    ** Execute environment
    ** Invoke db:load_config (first_time)
    ** Execute db:load_config
    ** Execute db:migrate
    ** Invoke db:_dump (first_time)
    ** Execute db:_dump
    ** Invoke db:schema:dump (first_time)
    ** Invoke environment 
    ** Invoke db:load_config 
    ** Execute db:schema:dump
    rake aborted!
    Don't know how to build task 'status'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/task_manager.rb:49:in `[]'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:148:in `invoke_task'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block (2 levels) in top_level'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `each'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:106:in `block in top_level'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:115:in `run_with_threads'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:100:in `top_level'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:78:in `block in run'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:165:in `standard_exception_handling'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/lib/rake/application.rb:75:in `run'
    /var/lib/gems/2.0.0/gems/rake-10.1.1/bin/rake:33:in `<top (required)>'
    /usr/local/bin/rake:23:in `load'
    /usr/local/bin/rake:23:in `<main>'`enter code here`

【问题讨论】:

  • 我遇到了同样的问题 - 我删除了迁移文件,运行 rake db:migrate - 再次添加迁移文件,然后再次运行 rake db:migrate

标签: ruby-on-rails rake migrate


【解决方案1】:

迁移命令中不需要status

rake db:migrate

应该够了。

由于命令中有状态,您实际上从rake 收到错误:

rake aborted!
    Don't know how to build task 'status'

编辑

经过我们的讨论,我现在了解更多。

迁移Demographics 过去已应用于数据库。其 14 位日期时间包含在 schema_migrations 表中证明了这一点。

迁移被设计为只运行一次。他们对数据库(架构和/或数据)进行了更改,然后您继续前进。

当您运行rake db:migrate 时,它会发现任何尚未应用到数据库的迁移(按照迁移文件名的日期时间顺序),应用它,然后在schema_migrations 中放置一个数据时间条目。任何在 schema_migrations 中已有条目的迁移都会被忽略。

如果您想对数据库进行进一步的更改 - 甚至是在之前迁移中创建的表 - 您应该创建一个新的迁移,然后使用 bin rake db:migrate 应用它。

是的,您可以撤销之前应用的迁移 - rake db:rollback。回滚将以应用迁移的相反顺序应用,即。从schema_migrations 的末尾向后工作。默认情况下,它只会退出最后一次迁移,尽管您可以使用STEP 参数做更多事情(例如rake db:rollback STEP=3)。

您还可以使用可选的 STEP 参数再次重做先前应用的迁移 - rake db:migrate:redo。这实际上只是回滚后迁移的捷径。

推荐

我对您的建议是将Demographics 迁移文件恢复到您进行更改之前的状态。如果将来需要重新应用迁移,这一点很重要。

我现在将创建一个新迁移以将更改应用到您的表:

rails generate migration UseForiegnKeysInDemographics

进行必要的修改;您只需要提及对表格的更改:

例如

class UseForiegnKeysInDemographics < ActiveRecord::Migration
  def change
    remove_column :demographics, :race
    remove_column :demographics, :other_race
    remove_column :demographics, :education
    remove_column :demographics, :other_education

    add_column :demographics, :race_id,            :integer
    add_column :demographics, :other_race_id,      :integer
    add_column :demographics, :education_id,       :integer
    add_column :demographics, :other_education_id, :integer
  end
end

并应用这个新的迁移:

rake db:migrate

我建议您阅读 Rails 迁移指南; http://guides.rubyonrails.org/migrations.html 因为它比我的简要总结更好地解释了一切。

脚注: 当您想将外键添加到人口统计表中时,您可能需要考虑add_reference 而不是add_column。我没有在上面的示例中包含此内容,因为我不知道您的其他表格的详细信息,但它在 Rails 指南中有详细记录。

【讨论】:

  • 在命令中包含“状态”是我看到错误的唯一方法。当我执行“rake db:migrate”时,它只会返回我的提示,但数据库不会改变。 'rake db:migrate --trace' 转储一些无用的 cmets: Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute environment ** Invoke db:load_config (first_time) ** Execute db:load_config ** Execute db:migrate ** 调用 db:_dump (first_time) ** 执行 db:_dump ** 调用 db:schema:dump (first_time) ** 调用环境 ** 调用 db:load_config ** 执行 db:schema:dump
  • 实际上看起来你什么也看不见,因为没有什么可看的。此迁移是否可能已加载到数据库中?您是否更改了它但没有先将其回滚?查看您的 schema_migrations 表,看看是否已经有此迁移的条目。
  • 我是一名 Rails 新手。我检查了 schema_migrations 表,其中有 18 行。只是一个带有数字的版本列。有没有办法强制执行排队的迁移?另外,我查看了 schema.rb,我的迁移并没有影响这个文件。感谢您的帮助!
  • 版本列中的数字对应于每个迁移文件名的开头数字 - 实际上它只是创建迁移的日期时间。对于您尝试加载的此迁移,请查看文件名开头的 14 位日期时间字符串是否是 schema_migrations 表中的字符串之一。如果是,则迁移已经加载,这就是为什么当您尝试再次加载它时它什么也不做。
  • 是的,先生,我正在使用的迁移在列表中。是否有某种 rake db:doit 命令来激活此迁移?我错过了什么?再次感谢。
【解决方案2】:

我发现你的命令有问题:rake db:migrate status --trace

您正在尝试使用一个命令来实现两件事,即运行迁移以及通过执行的详细步骤检查迁移的状态。

您可以通过两种方式进行:

1.第一种方式

要执行迁移,请使用

rake db:migrate --trace

然后检查应用程序中所有迁移的status,使用

rake db:migrate:status

2。或者

rake db:migrate db:migrate:status --trace

您几乎已经完成了,但 status 任务位于 db:migrate 命名空间内,因此您需要使用 db:migrate:status。在这里,第一个 db:migrate 将执行待处理的迁移,而 db:migrate:status 将提供所有迁移的状态,--trace 将提供完整的回溯。

【讨论】:

  • rake db:migrate --trace:** Invoke db:migrate (first_time) ** Invoke environment (first_time) ** Execute environment ** Invoke db:load_config (first_time) ** Execute db: load_config ** 执行 db:migrate ** 调用 db:_dump (first_time) ** 执行 db:_dump ** 调用 db:schema:dump (first_time) ** 调用环境 ** 调用 db:load_config ** 执行 db:schema:转储
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-06
  • 1970-01-01
  • 2012-05-15
  • 2017-03-01
  • 2018-02-05
  • 2014-07-16
相关资源
最近更新 更多