Ho eseguito "rake db: migrate" per risincronizzare schema.db con lo schema del mio database. Ma ha fallito, dicendo che una delle mie tabelle esiste già. Penso che stia cercando di ricreare il tavolo. Se vuoi semplicemente ottenere lo schema.rb aggiornato per riflettere eventuali modifiche apportate al database indipendentemente da Rails, quale comando dovresti usare se non "rake db: migrate"? E qual è la migliore fonte di documentazione su questo tipo di cose?rake db: esegue la migrazione del comando corretto per risincronizzare schema.rb con lo schema del database?
risposta
"rake db: migrate" proverà a eseguire tutte le migrazioni in sospeso per il progetto. Se vuoi semplicemente scaricare lo schema fai un "rake db: schema: dump".
Ma penso che tu abbia un problema dove dice che la tabella esiste già. Una delle migrazioni sta fallendo perché la tabella che sta tentando di aggiungere esiste già nel tuo db. Ne hai creato uno a mano? Hai eseguito una migrazione, ma non hai scritto nulla per questo? Dovrai risolvere questo problema prima di poter scrivere future migrazioni. Se è solo un errore, e il tavolo è lì e corretto e tu vuoi ignorarlo. La mia raccomandazione è di modificarla commentando la tabella create nella migrazione non riuscita. Quindi eseguire "rake db: migrate". Quindi, ma la tabella di creazione indietro. Questo aggiornerà la versione dello schema.
Assicurati di scrivere down corretto su tutte le migrazioni.
Buona spiegazione. Grazie. – drizzle
Provare rake db:schema:dump
o rake db:migrate:redo
.
rispondere alla tua ultima domanda per quanto riguarda la documentazione:
- una guida alle rotaie compiti rake per rotaie 2.1+: http://www.tutorialspoint.com/ruby-on-rails-2.1/rails-and-rake.htm
- una buona screencast sulle migrazioni: http://railscasts.com/episodes/107-migrations-in-rails-2-1
Ho scoperto che occasionalmente, quando le cose si fanno un po 'strane, ti troverai in una situazione in cui Rails vorrà eseguire una migrazione che dovrebbe giustamente considerarsi già fatta (la tabella esiste già, ecc.). È possibile contrassegnare una migrazione come fatto trovando il suo numero (la parte numero all'inizio del nome del file), andando in mysql e l'emissione di una query in questo modo:
insert into schema_migrations values('20090521153438');
(o qualunque sia il numero della migrazione è)
O se è un essere di migrazione plug-in esecuzione utilizzando migrate_plugin del deserto:
insert into plugin_schema_migrations values('my_plugin', '005');
Grazie per il suggerimento. – Espen
Bel dolore, grazie per questo! Questa è l'unica soluzione che ho visto che non elimina tutti i tuoi dati **. Usalo se hai dati in tabelle che non vuoi cancellare :) – FireDragon
un'altra, se hacky, è la tattica di commentare il corpo della migrazione incriminata e quindi migrare. – hoff2
Prova
RAILS_ENV=development rake db:drop
prima
RAILS_ENV=development rake db:migrate
ed essere felici!
Fare in modo che lo si esegue sul vostro ambiente di test o di sviluppo dal momento che questo sarà eliminare il database/tabelle
rake db:migrate:reset
scenderà tutte le tabelle, eseguire tutte le migrazioni e creare un nuovo file schema.rb
.
Utilizzare rake db:schema:dump
.
$ rake -T | grep schema
rake db:schema:dump # Create a db/schema.rb file that is portable
# against any database supported by ActiveRecord
rake db:schema:dump
ricrea il file db/schema.rb
senza correre le tue migrazioni di nuovo, o far cadere tutte le tabelle (che implica la perdita dei dati di tali tabelle), quindi è il modo meno invasivo si può provare prima.
Prova ** 'rake db: schema: dump' ** e quindi concedi al tuo editor alcuni momenti per raccogliere le modifiche al file. –