【问题标题】:Rails error: Index name '...' on table '...' already exists while running rails db:migrateRails 错误:运行 rails db:migrate 时表 '...' 上的索引名称 '...' 已存在
【发布时间】:2017-10-25 15:14:06
【问题描述】:

因此,我正在与一位同事合作,他添加了一些额外的迁移文件,并且在我提取他们的版本后,按照正常程序运行 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

结束

【问题讨论】:

  • 你会展示迁移吗?
  • 添加了有问题的迁移文件
  • 删除数据库应该会删除所有挂起的迁移。是否存在创建表和索引的早期迁移?
  • @TomAranda 删除数据库绝对是最后的手段,并且通常会导致更多问题(例如数据丢失或如果您备份-删除-恢复以避免丢失所有数据,则什么也不做)它解决了.
  • @muistooshort,公平点。我并不是要推荐那种做法,我也不推荐那种做法。但是,用户说他已经尝试过了,所以我很困惑为什么它不起作用。

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


【解决方案1】:

这个:

t.references :user, foreign_key: true

为您在authorizations.user_id 添加索引。如果您检查references documentation,它将指向您add_reference,上面写着:

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

所以index: true 是您调用t.references :user 时的默认值,它创建的索引与add_index :authorizations, :user_id 创建的索引相同。

【讨论】:

  • 试图通过移除 add_index :authorizations, :user_id add_index :authorizations, [:provider, :uid], unique: true 来解决这个问题
  • 所以您删除了add_index :authorizations, :user_id 并重新运行了迁移?
  • 这实际上是错误的:PG::DuplicateTable: 错误:关系“授权”已经存在:创建表“授权”(“id”大序列主键,“提供者”字符变化,“uid " 字符变化,"user_id" bigint,"created_at" 时间戳非空,"updated_at" 时间戳非空,约束 "fk_rails_4ecef5b8c5"
  • 您是否在某处手动创建了表格?还有什么不一般的吗?每个迁移都应该在一个事务中运行,并且 PostgreSQL 支持 DDL 事务(即它可以回滚模式更改),因此整个迁移应该运行或不运行。 PG::DuplicateTable 异常告诉您,在您尝试运行更新的迁移之前,某些东西创建了 authorizations 表。
【解决方案2】:

因此,我发现“有效”的唯一方法是实际删除迁移文件,然后运行 ​​rails db:migrate。没有发现任何问题,没有错误。

不喜欢这种做法。

【讨论】:

  • 如果这是唯一对您有用的方法,那么您的迁移存在问题。在上面的评论中,您说您收到了另一个错误 - 您是否回滚了迁移,删除了相关行,然后重新运行它?正确的解决方案是修复迁移 - 删除文件对随后出现并检查它们脱离版本控制的人没有任何作用。
  • 所以在部署到 Heroku 时搞砸了,我能够让它工作。我重新创建了没有 add_index 的合并文件,它可以工作。
【解决方案3】:

检查它是表还是更改表,大多数时候您需要删除表或删除列然后再次运行迁移,它会很好去

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2015-01-27
    • 1970-01-01
    • 2012-11-23
    • 2019-02-16
    • 2021-04-09
    • 1970-01-01
    • 2015-11-24
    • 2011-07-14
    相关资源
    最近更新 更多