Error: Duplicate column name を解決する

rails db:migrationした時に、Error: Duplicate column name "fuga"というエラーが出た時の解決方法。 エラーにある通り、fugaというカラムはダブってまっせ〜ということです。 まず現在のDBのバージョンを確認。

$ rails db:migrate:status

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200707094922  Create books
   up     20200708020232  Add picture to books
   up     20200718144222  Devise create users
   drop  20200718161232  Add column to users
   up     20200802141002  Add omniauth columns to users
   up     20200802143752  Add index to users
   up     20200808064935  Create relationships
   up     20200809072542  Add not null to relationship

Add column to usersに対応するマイグレーションファイルが実行できていない。

次にdb/schema.rbを確認。

ActiveRecord::Schema.define(version: 2020_08_09_072542) do
   # 省略
    create_table "users", force: :cascade do |t|
       t.string "name"
    end
end

既にUserのnameというカラムは作成されていることを確認できる。 つまりマイグレーションの実行結果は既にDBに反映されているため、同じマイグレーションを実行することはできないということ。 よって、マイグレーションファイルを以下のように修正し、rails db:migrateする。

class AddColumnsToUsers < ActiveRecord::Migration[6.0]
  def change
  # 何も書かない
  end
end

これで全てのマイグレーションを実行できた。

$ rails db:migrate:status

database: db/development.sqlite3

 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20200707094922  Create books
   up     20200708020232  Add picture to books
   up     20200718144222  Devise create users
   up     20200718161232  Add column to users
   up     20200802141002  Add omniauth columns to users
   up     20200802143752  Add index to users
   up     20200804145226  Create active storage tablesactive storage
   up     20200808064935  Create relationships
   up     20200809072542  Add not null to relationship

修正したマイグレーションファイルは、元の状態に戻しておく。