修复迁移错误

Fixing migration error

我试图创建一个迁移以将角色添加到我的用户表,但我不小心输入了 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

在那种情况下,右键单击并删除两个迁移文件并重新开始。存在该错误是因为它认为您要向用户添加两个都命名为 role 的列 table

更新

在这种情况下,如果角色已存在于您的用户 table 中,则必须已成功迁移 运行 并且无需 运行 另一个。只要 role 列存在,尝试添加另一个名为 role 的列总是会出错。如果你想测试你是否仍然能够添加新列,你总是可以通过创建测试迁移 AddSomethingToUsers something:string 和 rake db:migrate 来测试,然后 rake db:rollback 来撤消。但这一切似乎都奏效了,所以我可能不会把它弄得太多。

当您 运行 第一次迁移时,角色列被添加到用户 table。第二次迁移的错误告诉你很多。

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

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

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

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