Ho perso il mio schema.rb! Può essere rigenerato?


133

A causa di alcuni problemi di distribuzione ho smesso di tracciare schema.rb in git. In qualche modo l'ho riempito e da qualche parte lungo il modo in cui il mio file schema.rb è scomparso.

Esiste un modo per rigenerare schema.rb dal database o dalle migrazioni? Preferirei non perdere i dati esistenti.

Risposte:


230

Se lo esegui rake -T, verranno elencate tutte le possibili attività di rake per il tuo progetto Rails. Uno di questi è db: schema: dump che ricrea lo schema.rb per l'app Rails dal database.

bundle exec rake db:schema:dump

Grazie mille, molte risposte ma sembra che tu sia stato il primo (solo) quindi spunta per te. Solo curioso, questo genera lo schema dal database stesso o dalle migrazioni?
Brad

7
Dal database stesso, quindi fai attenzione se ci sono cambiamenti avvenuti al di fuori delle migrazioni.
mguymon,

1
schema.rb contiene ancora uno schema vuoto dopo rake db:schema:dumpsu rotaie 2.0
Will Hardwick-Smith

Il mio file schema.rb rimane esattamente lo stesso dopo aver eseguito i comandi sopra
stevec

59

Attenzione,

rake db:schema:dump

scaricherà lo schema DB corrente DAL DB . Ciò significa che se hai apportato modifiche alle tue migrazioni, queste NON si rifletteranno nel file schema.rb che non è quello che desideri IMO.

Se si desidera ricreare lo schema dalle migrazioni, attenersi alla seguente procedura:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate

1
Ciò comporterebbe la perdita di dati, cosa che l'OP ha affermato di voler evitare. Inoltre, come sottolinea Colin, rigenerare il database esclusivamente dalle migrazioni è potenzialmente una pessima idea a causa della maggiore possibilità di incorrere in strani problemi di dipendenza (in generale). Se ci sono migrazioni in sospeso, sarebbe probabilmente meglio eseguire quelle ultime migrazioni sulla macchina di sviluppo, quindi eseguire il rake db:schema:dumpcomando.
Paul Richter,

4
Ogni tela è chiaramente spiegata nella mia risposta. Mi sono morso ESATTAMENTE eseguendo solo lo schema: dump e non ottenendo uno schema pulito. L'OP sta parlando del monitoraggio dello schema in un CVS. Vorrei che il mio schema fosse allineato con le mie definizioni nelle mie migrazioni e non una versione obsoleta da un DB di produzione o da un vecchio DB di sviluppo
gamov

11
rake db:schema:dump

Penso che questo sia ancora valido in Rails 3: rigenera lo schema.rb dal database.


8

RAILS 5 Way:

rails db:schema:dump

o se incontri Gem :: LoadError allora:

bundle exec rails db:schema:dump

Nota:

nelle rotaie 5 si consiglia di generare / eseguire le attività utilizzando railsinvece di rake, questo è solo da ricordare, le attività generate dalle rotaie sono di estensione .rakevedere in lib/tasks/myTask.rake. il che significa che queste attività possono anche essere eseguite anteponendo rake.


5

Se ti rigeneri schema.rblocalmente, dovresti stare bene. Contiene semplicemente una rappresentazione della struttura delle tabelle del database. I dati stessi non sono contenuti in questo file.

Per rigenerare il tuo schema.rbfile, esegui:

bundle exec rake db:schema:dump

Quindi esegui semplicemente il commit del nuovo schema.rbfile e dovresti essere in buona forma!


4

Direttamente dal file schema.rb stesso:

Se è necessario creare il database dell'applicazione su un altro sistema, è necessario utilizzare db:schema:load, non eseguire tutte le migrazioni da zero. Quest'ultimo è un approccio imperfetto e insostenibile (più migrazioni accumulerai, più lenta verrà eseguita e maggiore sarà la probabilità di problemi).

Quindi NON fare il suggerimento di rake db:migrate, che è stato suggerito nella - al momento in cui scrivo - la risposta più bassa.


Probabilmente vorrai eseguire le ultime migrazioni in sospeso se ce ne sono sulla tua macchina di sviluppo prima di rigenerare lo schema, ma sì rigenerare il database esclusivamente dalle migrazioni è una pessima idea, soprattutto perché ciò comporterebbe la perdita di dati.
Paul Richter,

1

Ho anche avuto un problema simile in cui il mio vecchio schema non si aggiornava anche se ho eliminato la migrazione.

Quindi, quello che ho fatto è stato eliminare tutte le tabelle esistenti nel database e migrarle di nuovo. Quindi l'esecuzione del comando "db: schema: load" mi ha dato un nuovo schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.