2009-05-17 6 views
3

Dies ist eine Art eines zu dieser Frage folgen: Can Rails Migrations be used to convert data?Konvertieren von Datenbankstruktur/Daten in Rails

Wenn ich auf einem Ast bin arbeiten, die, wenn sie wieder integriert und zur Produktion freigegeben, wird die Änderung Datenbankschema ziemlich drastisch. Wie können Sie sicherstellen, dass alle Daten in der Produktion in das neue Format konvertiert werden?

Ein einfaches Beispiel wäre, gibt es eine numerische Spalte, die wir in Text ändern möchten und einige Konvertierungsarbeiten an den Daten vornehmen. Dann wollen wir die alte Spalte fallen lassen.

Mir wurde geraten, keine Datenmanipulation bei Migrationen vorzunehmen, sondern stattdessen Rake-Aufgaben zu erstellen. Gibt es einen Mechanismus, mit dem sichergestellt werden kann, dass Rake-Aufgaben neben Migrationen ausgeführt werden können?

Im Moment ist die einzige Lösung, die ich mir vorstellen kann, alle Migrationen zusammenzufassen, die die nicht mehr existierenden Spalten in eine zweite Sammlung fallen lassen. Führen Sie die erste Gruppe von Migrationen aus, die die neuen Tabellen hinzufügen. Führen Sie die Rake-Aufgaben aus, und führen Sie dann die zweite Gruppe von Migrationen aus. Das scheint mir keine ideale Lösung zu sein und könnte leicht schiefgehen.

Antwort

2

Migrationen sind genau für diese Art von Zeug. Das Konvertieren von Daten in der Datenbank für eine neue Version der Anwendung mit oder ohne einer Schemaänderung sollte eine Migration sein. Dies garantiert, dass neue Änderungen in der Produktion vorgenommen werden, bevor die neue Version der Anwendung live geht.

Wenn Sie in der Zweigstelle arbeiten, erstellen Sie einfach eine neue Migration, die eine neue zeitgestempelte Datei erstellt. Wenn Sie wieder in den Freigabezweig einbinden, wird die Datei einfach kopiert. Wegen des Zeitstempels werden die Migrationen (wahrscheinlich) in der richtigen Reihenfolge ausgeführt.

Wenn die von Ihnen durchgeführte Konvertierung jedoch weiterhin von Zeit zu Zeit ausgeführt wird, sollten Sie eine Rake-Task verwenden.

+0

Jemand wies darauf in meiner vorherigen Frage hin; "Sagen wir ein paar Wochen später fügen Sie dem Modell eine neue Validierung hinzu - eine Validierung, die auf einem Feld ausgeführt wird, das in Ihrer zweiten Migration noch nicht existiert. Wenn Sie jemals die Datenbank aus der Migration 0 konstruieren würden, Ich habe ein paar Probleme. " – Kirschstein

+0

Aus diesem Grund sollten Sie möglichst keine Modellklassen in Ihren Migrationen verwenden. Eine Datenmigration, über die wir hier sprechen, kann und sollte mit Raw SQL über Model.connection.execute() erfolgen. –

Verwandte Themen