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.

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

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

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.


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.


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!


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.