Rails错误:运行rails db:migrate时,表'...'上的索引名称'...'已经存在

时间:2017-10-25 15:14:06

标签: ruby-on-rails postgresql rails-activerecord rails-migrations

所以我正在与一位同事一起工作,他添加了一些额外的迁移文件,按照正常程序,一旦我提取了他们的版本,我就运行了rails db:migrate。我最终得到以下错误:

 Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists

 ArgumentError: Index name 'index_authorizations_on_user_id' on table 'authorizations' already exists

所以我去检查架构并且表已经存在。那为什么失败了呢?通常在过去它只会在进行迁移时生成新的表条目/更新,那么为什么不忽略它呢?

我尝试过回滚并获取: 此迁移使用remove_columns,它不可自动反转。

我已经尝试过bin / rails db:migrate RAILS_ENV = development我遇到了同样的错误。

我已经完成了db:reset,db:drop,这一切都回到了我无法运行的挂起迁移问题。我做错了什么?

他们添加了以下迁移:20171024074328_create_authorizations.rb

 class CreateAuthorizations < ActiveRecord::Migration[5.1]
  def change
    create_table :authorizations do |t|
      t.string :provider
      t.string :uid
      t.references :user, foreign_key: true

      t.timestamps

      add_index :authorizations, :user_id
      add_index :authorizations, [:provider, :uid], unique: true
    end
  end

3 个答案:

答案 0 :(得分:3)

此:

t.references :user, foreign_key: true

为您添加authorizations.user_id的索引。如果您选中references documentation,它会指向add_reference,并说明:

  

:index
  添加适当的索引。默认为true。 [...]

因此,当您致电index: true并创建t.references :user创建的相同索引时,add_index :authorizations, :user_id是默认设置。

答案 1 :(得分:0)

所以我发现“工作”的唯一一件事就是实际删除迁移文件然后运行rails db:migrate。没有抓到任何东西,没有错误。

不喜欢这个有用的事实。

答案 2 :(得分:0)

检查它是表还是已更改的表,大多数情况下,您需要删除表或删除列,然后再次运行迁移,这样做会很好