2010-07-27 10 views
40

, in dem ich „Rebasieren“ im Wörterbuch bedeuten, anstatt git Definition ...Rebase Rails-Migrationen in einem langen laufenden Projekt

Ich habe ein großes, langen Lauf Rails-Projekt, das über 250 Migrationen hat, ist es immer eine unhandliche Note, um all diese Dinge zu bewältigen.

Das gesagt, ich brauche eine Basis, aus der meine Datenbank zu säubern und neu zu erstellen, wenn Tests ausgeführt werden. Daher sind die darin enthaltenen Daten wichtig.

Hat jemand irgendwelche Strategien für sagen, Dumping das Schema an einem bestimmten Punkt - Archivierung von allen alten Migrationen und neu beginnen mit neuen Migrationen.

Offensichtlich kann ich Rake Schema: Dump - aber ich brauche wirklich einen Weg, dass db: migrate wird zuerst das Schema laden und dann starten Sie den Rest der Migrationen.

Ich möchte weiterhin Migrationen verwenden, da sie in der Entwicklung sehr nützlich sind, aber es gibt keine Möglichkeit, dass ich zurück gehe und eine Migration von 2007 bearbeite, so dass es albern scheint, sie zu behalten.

Antwort

46

Im Allgemeinen müssen Sie alte Migrationen nicht bereinigen. Wenn Sie db: migrance from scratch ausführen (keine vorhandene Datenbank), verwendet Rails db/schema.rb, um die Tabellen zu erstellen, anstatt jede Migration auszuführen. Andernfalls werden nur die Migrationen ausgeführt, die für das Upgrade vom aktuellen Schema auf das neueste erforderlich sind.

Wenn Sie noch Migrationen zu kombinieren, bis zu einem bestimmten Punkt zu einem einzigen, könnten Sie versuchen zu:

  • Migrate von Grund auf bis zur gezielten Schema rake db:migrate VERSION=xxx
  • Dump das Schema mit rake db:schema:dump mit
  • Entfernen Sie die Migrationen vom Anfang bis zur Version xxx und erstellen Sie eine einzelne neue Migration mit dem Inhalt von db/schema.rb (setzen Sie die Anweisungen create_table und add_index in die Methode self.up der neuen Migration).

Stellen Sie sicher, dass Sie eine der alten Migrationsversionsnummern für Ihre aggregierte neue Migration auswählen. Andernfalls würde Rails versuchen, diese Migration auf Ihrem Produktionsserver anzuwenden (was Ihre vorhandenen Daten bereinigen würde, da die Anweisungen create_table: force⇒true verwenden).

Wie auch immer, würde ich nicht empfehlen, dies zu tun, da Rails normalerweise Migrationen gut selbst behandelt. Wenn Sie es dennoch tun möchten, sollten Sie zunächst alles überprüfen und zunächst versuchen, bevor Sie den Verlust von Daten auf Ihrem Produktionsserver riskieren.

+3

Sie erkennen t Hat das nur funktioniert, wenn Ihren Migrationen keine Daten hinzugefügt wurden? schema.rb speichert keine Daten, die während einer Migration erstellt wurden. – weexpectedTHIS

+4

@weexpectedTHIS, weshalb Sie Daten in Migrationen nicht berühren sollten. – Scottymeuk

+0

@scottymeuk dann, wie schlagen Sie vor, eine Änderung an Daten zu implementieren – weexpectedTHIS

1

Zusätzlich zur angegebenen Antwort (die angibt, wie Sie das Migrationsvolumen konsolidieren können) weisen Sie auf Bedenken hin, Daten zu bereinigen (was vermutlich nach dem Hinzufügen von Fixtures zu Ihren Tabellen manuell hinzugefügt wird); was darauf hinweist, dass du davon abhängig bist, einen anfänglichen Datenzustand zu aktualisieren. Einige Projekte erfordern in der Tat eine intensive Verfeinerung der Basisdaten, Rekonstruktion und Neubesetzung von Tabellen. Unseres hängt stark von der wiederholten Ausführung dieser Operationen ab, und ich habe festgestellt, dass, wenn Sie Ihr Schema vollständig auf SQL-Execute-Anweisungen reduzieren können, Ihre Tabellen viel schneller als aus der Ruby-Syntax wiederhergestellt werden.

Eine triviale weitere Hilfe Ihre Tabellen in dem Wiederaufbau ist ein separates Terminal-Fenster zu einer einzigen kombinierten Befehlsanweisung zu widmen: drop db:

db

Rake erstellen db: schema: load db: Leuchten: load

Jedes Mal, wenn Sie Ihre Tabellen neu aufbauen und neu füllen müssen, wird diese Routineaufgabe mit einem Pfeil nach oben und zurück ausgeführt. Wenn in SQL-Anweisungen für die Ausführung von Anweisungen kein Konflikt auftritt und wenn keine weiteren Migrationen ausgeführt werden, während sich das Projekt im Entwicklungsstatus befindet, werden die SQL-Anweisungen möglicherweise besser ausgeführt als doppelt so schnell wie die Ruby-Syntax. Unsere Tabellen werden in 20 Sekunden auf diese Weise neu aufgebaut und neu gefüllt, während die Ruby-Syntax den Prozess auf weit über 50 Sekunden erhöht. Wenn Sie darauf warten, dass diese Daten aktualisiert werden, um weitere Arbeiten auszuführen (besonders viele Male), macht dies einen großen Unterschied im Workflow.

3

Um die Zusammenführung (oder Quetschen) von Migration zu automatisieren, können Sie die Squasher gem

Einfach

gem install squasher 

installieren und laufen mit einem Datum und Migrationen vor diesem Zeitpunkt werden zusammengelegt verwenden:

squasher 2016 # => Will merge all migration created before 2016 

Mehr Details in the README

Verwandte Themen