2016-09-14 50 views
1

我已将add_column:users,:confirmed_at(confirmation_at),:datetime意外命名。所以我把它改为相应的字段名称:(confirmed_at)第一次迁移后更改字段名称时,Rails数据库迁移中止错误

然后我输入了:rake db:rollback in command line。它被中止由于某种原因,下面但是首先我的Rails信息数据库迁移文件中的代码:

迁移后
class AddConfirmableToDevise < ActiveRecord::Migration 
    def up 
    add_column :users, :confirmation_token, :string 
    add_column :users, :confirmed_at, :datetime 
    add_column :users, :confirmation_sent_at, :datetime 

    add_index :users, :confirmation_token, unique: true 
    end 

    def down 
    remove_column :users, :confirmation_token, :confirmed_at, :confirmation_sent_at 
    end 
end 

错误:

tzurch:~/workspace (gravitar) $ rake db:migrate:redo 

#the error that came up below 
_________________________________________________ 
== 20160902201448 AddFullnameToUser: reverting ================================ 

-- remove_column(:users, :fullname, :string) 

-> 0.0207s 

== 20160902201448 AddFullnameToUser: reverted (0.0284s) ======================= 

== 20160902201448 AddFullnameToUser: migrating ================================ 

-- add_column(:users, :fullname, :string) 

-> 0.0008s 

== 20160902201448 AddFullnameToUser: migrated (0.0009s) ======================= 

== 20160913221959 AddConfirmableToDevise: migrating =========================== 

-- add_column(:users, :confirmation_token, :string) 

-> 0.0009s 

-- add_column(:users, :confirmed_at, :datetime) 

-> 0.0005s 

-- add_column(:users, :confirmation_sent_at, :datetime) 

rake aborted! 

StandardError: An error has occurred, this and all later migrations canceled: 

SQLite3::SQLException: duplicate column name: confirmation_sent_at: ALTER TABLE "users" ADD "confirmation_sent_at" datetime: 

回答

0

这里的问题是你用来删除列的语法是错误的。

正确的语法是remove_column

remove_column(table_name, column_name, type = nil, options = {}) 

换下来的迁移与

class AddConfirmableToDevise < ActiveRecord::Migration 
    def up 
    add_column :users, :confirmation_token, :string 
    add_column :users, :confirmed_at, :datetime 
    add_column :users, :confirmation_sent_at, :datetime 

    add_index :users, :confirmation_token, unique: true 
    end 

    def down 
    remove_column :users, :confirmation_token 
    remove_column :users, :confirmed_at 
    remove_column :users, :confirmation_sent_at 

    remove_index :users, :confirmation_token 
    end 
end 

或者完全删除down迁移,并与change取代up,轨道将弄清楚如何回滚:

class AddConfirmableToDevise < ActiveRecord::Migration 
    def change 
    add_column :users, :confirmation_token, :string 
    add_column :users, :confirmed_at, :datetime 
    add_column :users, :confirmation_sent_at, :datetime 

    add_index :users, :confirmation_token, unique: true 
    end 
end 
+0

I尝试完全删除def,然后命令rake db:migrate:redo收到下面的同样的错误,似乎在db中有一些重复的字段,正如错误所示。如果是这样,我该如何查找和删除。裸体w /我通过ruby粗糙....:ActiveRecord :: StatementInvalid:SQLite3 :: SQLException:重复的列名称:confirmation_sent_at:ALTER TABLE“users”ADD“confirmation_sent_at”datetime – Zurch

+0

您需要'rake db:migrate:首先迁移VERSION = migration_version_no',然后再迁移'rake db:migrate:up VERSION = migration_version_no' –

+0

非常感谢我能够恢复,然后使用适当的字段名称进行迁移 – Zurch

0

我想你已经在这个表中的分贝有confirmation_sent_at场