2011-09-17 12 views
6

Este es el error que consigo cuando estoy la primera instalación Diseñar y ejecutar rake db:migrate:Diseñar rake db: migrate falla debido a la columna duplicado en la mesa de mi usuario - Rails 3.1

== 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 

Teniendo en cuenta que esto es sólo los datos de prueba , Podría simplemente eliminar esa columna en mi archivo db y volver a ejecutarla, pero eso no parece muy Railsy, ​​aunque solo sea por el hecho de que hará que mi servidor de ensayo (el único otro servidor con mi aplicación) esté fuera de servicio. sincronizar con mi localhost.

Además, ¿qué pasa si hay un conflicto con otra columna.

Dado que este es el esquema de mi tabla User antes de ejecutar la migración, ¿cómo debo manejar esto? ¿Con una migración de algún tipo que cambia de nombre?

# == 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 
# 

Respuesta

4

Pruebe rake db: rollback y vuelva a intentarlo. Cuando lo hiciste la primera vez que agregó la columna de id. y por qué estás

sumando id: intege not null, clave principal es automático en los rieles. Debe tener un aspecto como este.

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 

Puede obtener más información aquí http://guides.rubyonrails.org/migrations.html

+1

No, lo que sucedió fue que tuve mi modelo 'User' con ese esquema allí antes de ejecutar' db: migrate'. Incluso tuve algunos usuarios almacenados en la tabla con la información existente. Sin embargo, ahora que intento instalar Devise en un modelo de Usuario existente, aparece este error. Entonces sí, sé que existe una columna ': email'. Solo quiero que lo ignore o lo modifique de la manera que necesita ser modificado. – marcamillion

+1

puede omitirlo pero al comentar nuestra línea en su migración. Luego, después de eso, ejecuta rake db: migrate nuevamente. – Benjamin

+1

Sí, el mismo problema aquí y todo lo que hice fue comentar la línea donde se creó la tabla de correo electrónico en la migración de diseño, por ejemplo # t.string: email,: null => falso,: predeterminado => " – mattwallace

2

golpeo lo mismo añadiendo concebir a una base de datos existente. Esto lo fijó para mí:

Modificar la migración legado autogenerado:

t.rename :email, :email_old # move my old email field out of the way 
... 
#add_index :users, :email, :unique => true ## comment out unique index 

migrar el db.

Hacer el (nuevo) los datos de campo de correo electrónico entradas únicas interactiva w/una llamada SQL:

update users set email=id; 

crear otra migración añadiendo la restricción única, y ejecutarlo:

class UniquifyIndex < ActiveRecord::Migration 
    def change 
     add_index :users, :email, :unique => true 
    end 
16

en la migración archivo generado por Idear, cambie la línea

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

para

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

Por lo tanto, en lugar de tratar de crear una nueva columna de correo electrónico, la migración cambia la existente a las especificaciones de Devise.

3

La resolución de este error es sencilla

  1. si ya ejecuta la función "rake db:migrate" Sugiero ejecutar rake db:rollback "
  2. Ir a" timestamp_add_devise_to_whatever.rb y comentar
  3. # t.string :email, null: false, default: ""
  4. siguiente también comenta esta
  5. # add_index :users, :email, unique: true
  6. Ejecutar rake db:migrate y listo. :)
+0

. esto funciona muy bien: stackoverflow siempre tiene la peor respuesta como la seleccionada: ¡esto es un error de la sociedad! –

Cuestiones relacionadas