修复迁移错误

时间:2016-01-24 07:54:50

标签: ruby-on-rails ruby database migration

我尝试创建迁移以向我的用户表添加角色,但我不小心输入了AddRolesToUsers而不是AddRoleToUser。所以我尝试使用正确的AddRoleToUsers创建新的迁移,但是当我尝试运行rake db:migrate时出现错误:

SQLite3::SQLException: duplicate column name: role: ALTER TABLE "users" ADD "role" integer/Users/miguel/.rvm/gems/ruby-2.2.1/gems/sqlite3-1.3.11/lib/sqlite3/database.rb:91:in `initialize' 

我试过rake db:migrate:down VERSION=删除我必须输入的那个,但我一直得到同样的错误。 PS:我在运行rake db:migrate:down VERSION=

后手动删除了迁移文件

rails g migration AddRoleToUsers role:integer

迁移文件:

class AddRoleToUsers < ActiveRecord::Migration
  def change
    add_column :users, :role, :integer
  end
end

2 个答案:

答案 0 :(得分:1)

运行第一次迁移时,角色列已添加到Users表中。第二次迁移的错误告诉你那么多。

要清除migration pending错误,您需要在新迁移中注释掉add_column语句。 即,

class AddRoleToUsers < ActiveRecord::Migration
  def change
    # add_column :users, :role, :integer
  end
end

然后运行迁移。这样,新迁移应该成功运行。

您现在可以取消注释并删除以前的迁移,这样在部署时,只会运行较新的迁移并成功添加role列。

答案 1 :(得分:0)

在这种情况下,右键单击并删除两个迁移文件,然后重新开始。该错误的存在是因为它认为您要将两个名为role的列添加到users表

<强>更新

在这种情况下,如果您的用户表中已存在角色,则必须已成功运行迁移,并且无需再运行另一个迁移。只要角色列存在,尝试添加另一个名为role的列将始终给您一个错误。如果你想测试你仍然能够添加新列,你可以随时通过创建测试迁移AddSomethingToUsers来检查:string和rake db:migrate to test,然后rake db:rollback to undo..but看起来它们似乎都是工作,所以我可能不会太乱用它。