rake db:迁移不工作,没有错误

时间:2014-03-30 18:07:56

标签: ruby-on-rails rake migrate

我试图运行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`

2 个答案:

答案 0 :(得分:1)

您在迁移命令中不需要status

rake db:migrate

应该足够了。

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

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

修改

根据我们的讨论,我现在了解更多。

迁移Demographics过去已经应用于数据库。这可以通过它包含在schema_migrations表中的14位数日期来证明。

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

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

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

是的,您可以退出以前应用的迁移 - rake db:rollback。回滚将按照应用迁移的相反顺序应用,即。从schema_migrations结束后退。默认情况下,它只会撤消上次迁移,但您可以使用STEP参数执行更多操作(例如rake db:rollback STEP=3)。

您还可以使用可选的STEP参数重新执行先前应用的migraton - rake db:migrate:redo。这实际上只是回滚后的一个快捷方式。

<强>建议

我向您推荐的是将Demographics迁移文件恢复到您进行更改之前的状态。如果迁移需要在将来全部重新应用,这一点非常重要。

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

rails generate migration UseForiegnKeysInDemographics

进行必要的修改;你只需要提一下表格的变化:

e.g。

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指南中有详细记录。

答案 1 :(得分:1)

我发现您的命令存在问题: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将为您提供完整的回溯。