Reputation: 21
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.
Upvotes: 0
Views: 93
Reputation: 21
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.
Upvotes: 1