Ich habe mein schema.rb verloren! Kann es regeneriert werden?

133

Aufgrund einiger Bereitstellungsprobleme habe ich die Verfolgung von schema.rb in git eingestellt. Irgendwie habe ich das vollgestopft und irgendwo auf dem Weg ist meine schema.rb-Datei verschwunden.

Gibt es eine Möglichkeit, schema.rb aus der Datenbank oder aus den Migrationen neu zu generieren? Ich würde es vorziehen, die vorhandenen Daten nicht zu verlieren.

Brad
quelle

Antworten:

230

Wenn Sie a ausführen rake -T, werden alle möglichen Rake-Aufgaben für Ihr Rails-Projekt aufgelistet. Eines davon ist db: schema: dump, mit dem die Datei schema.rb für die Rails-App aus der Datenbank neu erstellt wird.

bundle exec rake db:schema:dump
mguymon
quelle
Vielen Dank, viele Antworten, aber es sieht so aus, als wären Sie der Erste (nur), also kreuzen Sie für Sie an. Nur neugierig, generiert dies das Schema aus der Datenbank selbst oder aus den Migrationen?
Brad
7
Seien Sie also in der Datenbank selbst vorsichtig, wenn außerhalb der Migrationen Änderungen vorgenommen wurden.
mguymon
1
schema.rb enthält noch leeres Schema nach rake db:schema:dumpauf Schienen 2.0
Will Hardwick-Smith
Meine schema.rb-Datei bleibt nach dem Ausführen der obigen Befehle genau gleich
stevec
59

Vorsichtig,

rake db:schema:dump

speichert das aktuelle DB-Schema aus der DB . Dies bedeutet, dass Änderungen an Ihren Migrationen NICHT in der Datei schema.rb wiedergegeben werden, die IMO nicht entspricht.

Wenn Sie das Schema aus den Migrationen neu erstellen möchten, gehen Sie wie folgt vor:

rake db:drop  # ERASES THE DATABASE !!!! 
rake db:create
rake db:migrate
Gamov
quelle
1
Dies würde zu Datenverlust führen, den das OP vermeiden wollte. Darüber hinaus ist, wie Colin betont, die reine Neuerstellung der Datenbank aus den Migrationen möglicherweise eine sehr schlechte Idee, da die Wahrscheinlichkeit größer ist, dass (im Allgemeinen) auf seltsame Abhängigkeitsprobleme gestoßen wird. Wenn anstehende Migrationen anstehen, ist es wahrscheinlich am besten, diese letzten Migrationen auf dem Entwicklungscomputer auszuführen und dann den rake db:schema:dumpBefehl auszuführen .
Paul Richter
4
Jede Leinwand wird in meiner Antwort klar erklärt. Ich bin GENAU gebissen worden, indem ich nur das Schema: dump ausgeführt und kein sauberes Schema erhalten habe. Das OP spricht über die Verfolgung des Schemas in einem CVS. Ich möchte, dass mein Schema mit meinen Definitionen in meinen Migrationen
übereinstimmt
11
rake db:schema:dump

Ich denke, dass dies in Rails 3 noch gültig ist - es regeneriert die schema.rb aus der Datenbank.

pschuegr
quelle
8

SCHIENEN 5 Wege:

rails db:schema:dump

oder wenn Sie auf Gem :: LoadError stoßen, dann:

bundle exec rails db:schema:dump

Hinweis:

In Rails 5 wird empfohlen, dass die Task generiert / ausgeführt wird, indem railsstatt verwendet rakewird. Dies ist nur zu beachten, dass die von Rails generierten Tasks die Erweiterung haben, .rakesiehe in lib/tasks/myTask.rake. Dies bedeutet, dass diese Aufgabe auch durch Voranstellen ausgeführt werden kann rake.

Kaleem Ullah
quelle
5

Wenn Sie sich schema.rblokal regenerieren , sollte es Ihnen gut gehen. Es enthält lediglich eine Darstellung der Struktur Ihrer Datenbanktabellen. Die Daten selbst sind in dieser Datei nicht enthalten.

schema.rbFühren Sie Folgendes aus, um Ihre Datei neu zu generieren:

bundle exec rake db:schema:dump

Dann legen schema.rbSie einfach die neue Datei fest und Sie sollten in guter Verfassung sein!

Graham Swan
quelle
4

Direkt aus der Datei schema.rb selbst:

Wenn Sie die Anwendungsdatenbank auf einem anderen System erstellen müssen, sollten Sie db:schema:loadnicht alle Migrationen von Grund auf neu ausführen. Letzteres ist ein fehlerhafter und nicht nachhaltiger Ansatz (je mehr Migrationen Sie anhäufen, desto langsamer wird er ausgeführt und desto wahrscheinlicher sind Probleme).

Machen Sie also NICHT den Vorschlag von rake db:migrate, der in der - zum Zeitpunkt dieses Schreibens - am niedrigsten bewerteten Antwort vorgeschlagen wurde.

Colin Summers
quelle
Sie möchten wahrscheinlich die letzten ausstehenden Migrationen ausführen, wenn sich auf Ihrem Entwicklungscomputer irgendwelche befinden, bevor Sie das Schema neu generieren. Ja, die Datenbank nur aus den Migrationen neu zu generieren, ist eine sehr schlechte Idee, zumal dies zu Datenverlust führen würde.
Paul Richter
1

Ich hatte auch ein ähnliches Problem, bei dem mein altes Schema nicht aktualisiert wurde, selbst wenn ich die Migration gelöscht habe.

Also habe ich alle vorhandenen Tabellen in der Datenbank gelöscht und erneut migriert. Wenn ich dann den Befehl "db: schema: load" ausführte, erhielt ich eine neue schema.rb.

drop table my_table_name // deleted them individually
rake db:migrate
rake db:schema:dump // re-created a new schema
R.Cha
quelle