我试图运行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`
答案 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
将为您提供完整的回溯。