it-swarm.com.de

rake db: schema: last vs. migrationen

Sehr einfache Frage hier - wenn Migrationen langsam und umständlich werden können, wenn eine App komplexer wird, und wenn wir rake db:schema:load viel sauberer aufrufen müssen, warum gibt es überhaupt Migrationen?

Wenn die Antwort auf das Vorstehende lautet, dass Migrationen für die Versionskontrolle verwendet werden (schrittweise Aufzeichnung der Änderungen an der Datenbank), dann, wenn eine App komplexer wird und stattdessen rake db:schema:load verwendet wird, behalten sie weiterhin ihre primäre Funktion bei?


Vorsicht:

Aus den Antworten auf diese Frage: rake db:schema:load löscht Daten auf einem Produktionsserver, seien Sie also vorsichtig bei der Verwendung.

155
sscirrus

Bei Migrationen werden Änderungen an der Datenbank vorwärts und rückwärts vorgenommen. In einer Produktionsumgebung müssen während der Bereitstellung inkrementelle Änderungen an der Datenbank vorgenommen werden: Migrationen stellen diese Funktionalität mit einem fehlersicheren Rollback bereit. Wenn Sie rake db:schema:load auf einem Produktionsserver ausführen, werden Sie am Ende alle Ihre Produktionsdaten löschen. Dies ist eine gefährliche Angewohnheit.

Davon abgesehen halte ich es für eine vernünftige Praxis, Migrationen gelegentlich "zusammenzubrechen". Dies bedeutet, alte Migrationen zu löschen, sie durch eine einzelne Migration zu ersetzen (sehr ähnlich Ihrer schema.rb-Datei) und die schema_migrations-Tabelle zu aktualisieren, um diese Änderung zu berücksichtigen. Sei dabei sehr vorsichtig! Sie können Ihre Produktionsdaten leicht löschen, wenn Sie nicht aufpassen.

Als Nebenbemerkung bin ich fest davon überzeugt, dass Sie niemals Daten in die Migrationsdateien einfügen sollten. Die seed.rb-Datei kann dazu oder für benutzerdefinierte Rake- oder Bereitstellungsaufgaben verwendet werden. Wenn Sie dies in Migrationsdateien einfügen, wird Ihre Datenbankschemaspezifikation mit Ihrer Datenspezifikation gemischt und kann beim Ausführen von Migrationsdateien zu Konflikten führen. 

191
jesse reiss

Ich stolperte gerade über diesen Beitrag, das war lange her und sah nicht die Antwort, die ich erwartet hatte.

rake db:schema:load eignet sich hervorragend, wenn Sie ein System zum ersten Mal in Betrieb nehmen. Danach sollten Sie Migrationen normal ausführen.

Dies hilft Ihnen auch dabei, Ihre Migrationen jederzeit zu bereinigen, da das Schema alle Informationen enthält, um andere Maschinen in Produktion zu setzen, selbst wenn Sie Ihre Migrationen bereinigt haben.

28
ereslibre

Bei Migrationen können Sie auch Daten zur Datenbank hinzufügen. aber db: schema: load lädt nur das Schema.

9
Shaunak

Migrationen können rückgängig gemacht werden und bieten zusätzliche Funktionen. Wenn Sie beispielsweise einige Daten als Teil einer Schemaänderung ändern müssen, müssen Sie dies als Migration durchführen. 

5
Jamie Penney

Als Benutzer anderer ORMs erschien es mir immer seltsam, dass Rails nicht über eine Synchronisierungs- und Aktualisierungsfunktion verfügte. Durchlaufen Sie die vorhandene DB-Struktur und verwenden Sie dazu die Schemadatei (die das gesamte, aktuelle Schema darstellt), und fügen Sie gegebenenfalls Tabellen, Spalten und Indizes hinzu.

Für mich wäre das viel robuster, wenn auch etwas langsamer.

4
Dan James

rake db:migrate die Tabellen in der Datenbank einrichten. Wenn Sie den Migrationsbefehl ausführen, sucht er in db/migrate/nach Ruby-Dateien und führt sie mit der ältesten aus. Am Anfang jedes Migrationsdateinamens steht ein Zeitstempel.

Im Gegensatz zu rake db:migrate, das Migrationen ausführt, die noch nicht ausgeführt wurden, lädt rake db:schema:load das bereits in db/schema.rbint erzeugte Schema in die Datenbank.

Weitere Informationen zu rake-Datenbankbefehlen finden Sie hier .

0
Nesha Zoric

Ich habe bereits als Kommentar gepostet, finde es jedoch besser, die Kommentare der Datei db/schema.rb hier zu platzieren:

# Note that this schema.rb definition is the authoritative source for your
# database schema. If you need to create the application database on another
# system, you should be using db:schema:load, not running all the migrations
# from scratch. The latter is a flawed and unsustainable approach (the more migrations
# you'll amass, the slower it'll run and the greater likelihood for issues).
#
# It's strongly recommended that you check this file into your version control system.

Meiner Erfahrung nach ist es besser, die Migrationsdateien in git und nicht in die schema.rb-Datei zu speichern.

0
user1251840