0

I'm encountering an issue while running a Rails migration that adds Devise to my Users table. The error message points to a duplicate column name, specifically "email." The migration file causing the problem is located at /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb.

Here is the error:

`➜ pye-candles git:(master) ✗ rails db:migrate == 20231115201715 AddDeviseToUsers: migrating ================================= -- change_table(:users) rails aborted! StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:7:in block in up' /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:5:in up'

Caused by: ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: email /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:7:in block in up' /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:5:in up'

Caused by: SQLite3::SQLException: duplicate column name: email /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:7:in block in up' /Users/jaydenthelwell/pye-candles/pye-candles/db/migrate/20231115201715_add_devise_to_users.rb:5:in up' Tasks: TOP => db:migrate (See full trace by running task with --trace) ➜ pye-candles git:(master) ✗ `

Here's the relevant the migration file:

`# frozen_string_literal: true

class AddDeviseToUsers < ActiveRecord::Migration[7.0] def self.up change_table :users do |t| ## Database authenticatable t.string :email, null: false, default: "" t.string :encrypted_password, null: false, default: ""

  ## Recoverable
  t.string   :reset_password_token
  t.datetime :reset_password_sent_at

  ## Rememberable
  t.datetime :remember_created_at

  ## Trackable
  # t.integer  :sign_in_count, default: 0, null: false
  # t.datetime :current_sign_in_at
  # t.datetime :last_sign_in_at
  # t.string   :current_sign_in_ip
  # t.string   :last_sign_in_ip

  ## Confirmable
  # t.string   :confirmation_token
  # t.datetime :confirmed_at
  # t.datetime :confirmation_sent_at
  # t.string   :unconfirmed_email # Only if using reconfirmable

  ## Lockable
  # t.integer  :failed_attempts, default: 0, null: false # Only if lock strategy is :failed_attempts
  # t.string   :unlock_token # Only if unlock strategy is :email or :both
  # t.datetime :locked_at


  # Uncomment below if timestamps were not included in your original model.
  # t.timestamps null: false
end

add_index :users, :email,                unique: true
add_index :users, :reset_password_token, unique: true
# add_index :users, :confirmation_token,   unique: true
# add_index :users, :unlock_token,         unique: true

end

def self.down # By default, we don't want to make any assumption about how to roll back a migration when your # model already existed. Please edit below which fields you would like to remove in this migration. raise ActiveRecord::IrreversibleMigration end end

`

I deleted the User migration file as I thought this was causing the issue, the users table also has "email" but the problem persists.

1 Answer 1

1

After encountering the SQLite3::SQLException: duplicate column name: email error, I revisited my create_users migration file. The issue arose because the columns Devise was attempting to add were already present in the original migration.

To resolve this, I recreated the users table in my migration as follows:

class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      # t.string :email, null: false, default: ""
      # t.string :encrypted_password, null: false, default: ""
      # t.string :reset_password_token
      # t.datetime :reset_password_sent_at
      # t.datetime :remember_created_at
      t.string :first_name
      t.string :second_name
      t.date :d_o_b
      t.string :phone_number
      t.string :address

      ## Other Devise fields if needed

      t.timestamps null: false
    end

    add_index :users, :email, unique: true
    add_index :users, :reset_password_token, unique: true
    # Add other indexes if needed
  end
end

But commented out

  # t.string :email, null: false, default: ""
  # t.string :encrypted_password, null: false, default: ""
  # t.string :reset_password_token
  # t.datetime :reset_password_sent_at
  # t.datetime :remember_created_at

I commented out the columns that Devise was attempting to add (email, encrypted_password, etc.), as these were already included in the original migration. After making this adjustment, the migration ran successfully without any issues.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.