2011-09-17 10 views
6

Questo è l'errore che ottengo quando sto installando prima Devise e funzionante rake db:migrate:Devise rake db: migrate non riesce a causa di colonna duplicata nella tabella di mio utente - 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 

Dato che questo è solo dei dati di test , Potrei semplicemente cancellare quella colonna nel mio db ed eseguirla nuovamente, ma questo non sembra molto Railsy - se non altro per il fatto che uscirà fuori dal mio server di staging (l'unico altro server con la mia app) sincronizzare con il mio localhost.

Inoltre, cosa succede se c'è un conflitto con un'altra colonna.

Quindi, dato che questo è lo schema della mia tabella User prima di eseguire la migrazione, come dovrei gestirlo? Con una migrazione di qualche tipo che si rinomina?

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

risposta

4

Provare rake db: rollback e quindi riprovare. Quando l'hai fatto la prima volta ha aggiunto la colonna id. e perché sei

aggiungendo id: intege not null, chiave primaria è automatico nei binari. Dovrebbe sembrare come questo.

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 

È possibile ottenere maggiori informazioni qui http://guides.rubyonrails.org/migrations.html

+1

No, quello che è successo è che ho avuto il mio modello 'User' con quello schema lì prima di eseguire' db: migrate'. Ho persino avuto alcuni utenti memorizzati nella tabella con le informazioni esistenti. Tuttavia, ora che sto cercando di installare Devise in un modello utente esistente, ottengo questo errore. Quindi sì, so che esiste una colonna ': email'. Voglio solo ignorarlo o modificarlo nel modo in cui deve essere modificato. – marcamillion

+1

puoi saltarlo ma commentare la nostra linea sulla tua migrazione. Successivamente, esegui rake db: esegui di nuovo la migrazione. – Benjamin

+1

Sì, lo stesso problema qui e tutto ciò che ho fatto è stato commentare la riga in cui la tabella di posta elettronica viene creata nella migrazione di devise come in questo modo # t.string: email,: null => false,: default => "" – mattwallace

2

mi ha colpito la stessa cosa l'aggiunta di elaborare ad un DB esistente. Questo ha risolto il tutto per me:

Modificare la migrazione devise generata automaticamente:

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

migrare il db.

Fai il (nuovo) i dati di campo e-mail voci univoche in modo interattivo w/una chiamata SQL:

update users set email=id; 

Creare un'altra migrazione aggiungendo il vincolo univoco, ed eseguirlo:

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

nella migrazione file generato da Devise, modificare la riga

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

per

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

Quindi, invece di provare a creare una nuova colonna di posta elettronica, la migrazione cambia quella esistente alle specifiche di Devise.

3

risoluzione di questo errore è semplice

  1. se già esegue il "rake db:migrate" Suggerisco gestita rake db:rollback "
  2. Vai a" timestamp_add_devise_to_whatever.rb e commentare
  3. # t.string :email, null: false, default: ""
  4. Avanti anche commentare questo
  5. # add_index :users, :email, unique: true
  6. Esegui rake db:migrate e il tuo bene per andare. :)
+0

sei fantastico- Funziona alla grande - StackOverflow ha sempre la risposta peggiore di quella selezionata - questo è un bug della società! –

Problemi correlati