Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Devise rake db:migrate fails because of duplicate column in my User's table - Rails 3.1

This is the error I get when I am first installing Devise and running rake db:migrate:

==  AddDeviseToUsers: migrating ===============================================
-- change_table(:users)
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: email: ALTER TABLE "users" ADD "email" varchar(255) DEFAULT '' NOT NULL

Given that this is just test data, I could just delete that column in my db and re-run it, but that doesn't seem very Railsy - if only for the reason that it will making my staging server (the only other server with my app) out-of-sync with my localhost.

Also, what if there is a conflict with another column.

So given that this is the schema of my User table before running the migration, how should I handle this? With a migration of some sort that does a rename?

# == Schema Information
#
# Table name: users
#
#  id         :integer         not null, primary key
#  email      :string(255)
#  f_name     :string(255)
#  l_name     :string(255)
#  username   :string(255)
#  role_id    :integer
#  picture    :string(255)
#  about_me   :string(255)
#  website    :string(255)
#  created_at :datetime
#  updated_at :datetime
#
like image 200
marcamillion Avatar asked Sep 17 '11 10:09

marcamillion


2 Answers

In the migration file generated by Devise, change the line

  t.string :email,              :null => false, :default => ""

for

  t.change :email, :string,     :null => false, :default => ""

So instead of trying to create a new email colum, the migration changes the existing one to the specifications of Devise.

like image 149
Naoise Golden Avatar answered Sep 21 '22 21:09

Naoise Golden


Try rake db:rollback and then try again. When you did it the first time it added the id column. and why are you adding id :integer not null, primary key it's automatic in rails. It should look like this:

class CreateProducts < ActiveRecord::Migration
  def up
    create_table :products do |t|
      t.string :email
      t.text :f_name

      t.timestamps
    end
  end

  def down
    drop_table :products
  end
end

You can get more information here http://guides.rubyonrails.org/migrations.html

like image 22
Benjamin Avatar answered Sep 23 '22 21:09

Benjamin