2011-10-24 27 views
25

Ho creato un database con inventare e il generatore nifty. Sto cercando di fare un nuovo database con il generatore di nifty (rails g nifty:scaffold Asset user_id:integer), ma quando provo a migrare il database (rake db:migrate), ottengo il seguente errore:Rake interrotto ... la tabella 'users' esiste già

charlotte-dator:showwwdown holgersindbaek$ rake db:migrate 
== DeviseCreateUsers: migrating ============================================== 
-- create_table(:users) 
rake aborted! 
An error has occurred, all later migrations canceled: 

Mysql2::Error: Table 'users' already exists: CREATE TABLE `users` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `email` varchar(255) DEFAULT '' NOT NULL, `encrypted_password` varchar(128) DEFAULT '' NOT NULL, `reset_password_token` varchar(255), `reset_password_sent_at` datetime, `remember_created_at` datetime, `sign_in_count` int(11) DEFAULT 0, `current_sign_in_at` datetime, `last_sign_in_at` datetime, `current_sign_in_ip` varchar(255), `last_sign_in_ip` varchar(255), `name` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB 

Tasks: TOP => db:migrate 
(See full trace by running task with --trace) 

Sto seguendo un tutorial e hanno abbastanza difficile capire perché questo accade. Qualcuno può spiegare cosa sta succedendo?

risposta

11

La migrazione sta tentando di creare una tabella già esistente nel database.

Provare a rimuovere la tabella utente dal database. Qualcosa non ha funzionato nel tuo processo di migrazione. Dovresti anche confrontare la tua versione schema.rb con i tuoi file db/migrate/*. Rb.

Chiarimento:

Sembra che molti modo che gli utenti non sono d'accordo con la mia risposta, sia perché lo ritengono inesatte o non raccomandato.

Rimuovere un tavolo è sempre distruttivo e penso che tutti lo capiscano.

Avrei dovuto menzionare add_column, poiché la tabella veniva creata in un altro file di migrazione.

+39

Basta eliminare la tabella? Questa è una soluzione orribile. –

+1

Mi piacerebbe conoscere la tua soluzione. –

+12

Questo ovvio, ma voglio chiarire per chiunque lo faccia ... ** I tuoi dati in quella tabella andranno persi **. –

58

Nella tua create_users della migrazione (radice_app/db/migrate/..), aggiungere drop_table :users destra prima create_table :users ed eseguire rake db:migrate. Rimuoverà la tabella degli utenti prima di ricrearla. Puoi rimuovere quella riga di codice dopo aver eseguito questa migrazione in modo che non ti dia più tardi errori. Solo una piccola correzione se non hai l'interfaccia utente per accedere a un database (su heroku, ad esempio).

+0

Entrambe le soluzioni semi-lavorate ... Mi sembrava di aver fatto qualcosa di sbagliato nel toturial, quindi ho fatto un paio di passi indietro e l'ho rifatto. Grazie mille per le grandi soluzioni però. –

+13

Questo è ovvio, ma voglio chiarire per chiunque lo faccia ... ** I tuoi dati in quella tabella andranno persi **. –

+0

Dope. grazie amico. –

10

Se si conosce che il database è stato creato correttamente, è possibile commentare la parte di creazione del codice di migrazione. Per esempio:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 
# 
# add_index :votes, [:votable_id, :votable_type] 
# add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

Se la tabella è stato creato, ma i comandi successivi non sono stati completati, per qualche motivo, si può semplicemente lasciare le opzioni successive, ad esempio:

Class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
# create_table :votes do |t| 
# 
#  t.references :votable, :polymorphic => true 
#  t.references :voter, :polymorphic => true 
# 
#  t.boolean :vote_flag 
# 
#  t.timestamps 
# end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 

Se non si dispone di qualsiasi dato significativo nel tuo database per preservare comunque puoi semplicemente farlo cadere la tabella e tutti i dati e crearlo fresco. Per esempio (preavviso i "drop_table: utili", nel self.up):

class ActsAsVotableMigration < ActiveRecord::Migration 
    def self.up 
    drop_table :votes 
    create_table :votes do |t| 

     t.references :votable, :polymorphic => true 
     t.references :voter, :polymorphic => true 

     t.boolean :vote_flag 

     t.timestamps 
    end 

    add_index :votes, [:votable_id, :votable_type] 
    add_index :votes, [:voter_id, :voter_type] 
    end 

    def self.down 
    drop_table :votes 
    end 
end 
1

credo che questo sia un problema unico o più comune a mysql a rotaie, possibile avendo a che fare con la gemma mysql2 si.

Lo so perché sono passato da sqlite a mysql e ho iniziato ad avere sistematicamente questo problema.

Nel mio caso, ho semplicemente commentato il codice che era già stato eseguito e ha eseguito nuovamente la migrazione (che non sto aggiungendo più dettagli perché sembra che il ragazzo sopra di me l'abbia fatto).

1

Ho avuto un problema simile quando provavo ad aggiungere l'autenticazione Devise a una tabella utenti esistente.

La mia soluzione: ho scoperto che avevo due file di migrazione, entrambi cercando di creare la tabella Utenti. Quindi, piuttosto che cancellare la tabella (probabilmente non è la migliore abitudine a formarsi), ho commentato il primo file di migrazione (originale) che ha creato la tabella Users e quindi lasciato il file di migrazione di Devise così com'è. Riscatta la migrazione e ha funzionato bene.

Come risulta, il file Devise non causa il problema; Vedo che sta "cambiando" la tabella, non "creando", il che significa che anche senza l'installazione di escogitare, un db: migrate probabilmente avrebbe causato lo stesso problema (anche se non l'ho ancora testato).

21

hai bisogno di abbandonare quel tavolo dalla console SQL lite (Avrete perso tutti i dati in esso contenuti)

  1. Accedere alla console lite SQL, digitare nel terminale
    mysql <DB NAME HERE>

  2. Drop table (non dimenticare l'ultima ; (punto e virgola))
    drop table table_name;

  3. run db: migrate nuovo
    bin/rake db:migrate

Speranza che aiuta, ha funzionato per me

+0

La domanda è su MySQL, non su Sqlite. –

+0

true edit per mysql –

11

Se si vuole giocare al sicuro e non vogliono perdere tutti i dati, allora si può verificare se la tabella esiste nel tuo database.

class DeviseCreateUsers < ActiveRecord::Migration 
    def up 
    if table_exists?(:users) 
     # update or modify columns of users table here accordingly. 
    else 
     # create table and dump the schema here 
    end 
    end 

    def down 
    # same approach goes here but in the reverse logic 
    end 
end 
0

Se si vuole conservati i dati, rinominare la tabella, ma farlo nella migrazione per risparmiare tempo, quindi rimuoverlo una volta che la migrazione è corse.

Posizionare nella parte superiore della sezione fino alla sezione del file di migrazione.

rename_table :users, :users2 
4

Non eliminare tabelle. Migrazioni dei dati >!

La versione del database riflette già le modifiche che la migrazione che causa l'errore sta tentando di aggiungere. In altre parole, se la migrazione potesse essere saltata, tutto andrebbe bene. Controlla la tabella db_schema_migrations e prova a inserire la versione della migrazione errata (e.x, 20151004034808). Nel mio caso ciò ha causato l'esecuzione delle migrazioni successive e tutto sembra a posto.

Ancora non si sa cosa abbia causato questo problema.

Problemi correlati