59 Stimmen

Was ist der beste Weg, verwaiste Rails-Migrationen zu lösen?

Ich habe zwischen verschiedenen Branches in einem Projekt gewechselt und jeder von ihnen hat unterschiedliche Migrationen... Dies ist das Szenario:

$ rake db:migrate:status

 Status   Migration ID    Migration Name
--------------------------------------------------
   ...
   up     20130307154128  Spaltenänderung in Traffic-Capture
   up     20130311155109  Log-Einstellungen entfernen
   up     20130311160901  Log-Alarm-Tabelle entfernen
   up     20130320144219  ********** KEINE DATEI **********
   up     20130320161939  ********** KEINE DATEI **********
   up     20130320184628  ********** KEINE DATEI **********
   up     20130322004817  Replikat zu Root-Einstellungen hinzufügen
   up     20130403190042  ********** KEINE DATEI **********
   up     20130403195300  ********** KEINE DATEI **********
   up     20130403214000  ********** KEINE DATEI **********
   up     20130405164752  AP-Hostnamen korrigieren
   up     20130410194222  ********** KEINE DATEI **********

Das Problem ist, dass rake db:rollback überhaupt nicht funktioniert, weil die Dateien fehlen...

Was kann ich tun, um wieder rollbacks durchführen zu können und die KEINE DATEI-Nachrichten loszuwerden?

Übrigens sind rake db:reset oder rake db:drop keine Option, ich kann keine Daten aus anderen Tabellen verlieren...

69voto

Adrian Punkte 8012

Ich habe das Problem schließlich so gelöst:

(1) Gehe zu den Zweigen, die die Migrationsdateien haben, und rollen sie zurück. Dies ist nicht trivial, wenn Sie viele Zweige haben, was zu vielen Konflikten führt, wenn Sie sie zusammenführen. Deshalb verwende ich diese Befehle, um herauszufinden, zu welchen Zweigen jede verwaiste Migration gehört.

Also muss ich den Commit finden, wann die Migration zuletzt geändert wurde.

git log --all --reverse --stat | grep  -C 10

Ich nehme den Commit-Hash und bestimme, zu welchem Zweig er gehört, so:

git branch --contains 

Dann kann ich zu diesem Zweig zurückgehen, einen Rollback durchführen und diesen Vorgang für alle fehlenden Dateien wiederholen.

(2) Führe Migrationen aus: wechsle zum Branch, den du endgültig bearbeiten willst, und führe die Migrationen aus, dann solltest du bereit sein.

Problembehandlung

In einigen Fällen stieß ich auch auf verwaiste Migrationen, die auf gelöschten Branches waren.

Um dies zu lösen, erstellte ich Dummy-Migrationsdateien mit derselben Migrations-ID der fehlenden Dateien und rollte sie zurück. Danach konnte ich die Dummy-Migrationen löschen und einen sauberen Migrationsstatus haben :)

Eine weitere Alternative ist das direkte Löschen der fehlenden Dateien aus der Datenbank (rails dbconsole):

delete from schema_migrations where version='';

59voto

medik Punkte 1018

Migrationen werden in Ihrer Datenbank gespeichert. Wenn Sie die verwaisten Migrationen entfernen möchten, entfernen Sie sie aus der DB.

Beispiel für Postgres:

  1. Öffnen Sie psql:

    psql
  2. Verbinden Sie sich mit Ihrer DB:

    \c your_database
  3. Wenn Sie neugierig sind, zeigen Sie schema_migrations an:

    SELECT * FROM schema_migrations;
  4. Wenn Sie neugierig sind, überprüfen Sie, ob die verwaisten Migrationen vorhanden sind:

    SELECT version FROM schema_migrations WHERE version IN 
    ('20130320144219', '20130320161939', '20130320184628', '20130403190042',
     '20130403195300', '20130403214000', '20130410194222');
  5. Löschen Sie diese:

    DELETE FROM schema_migrations WHERE version IN ();

Jetzt, wenn Sie bundle exec rake db:migrate:status ausführen, sehen Sie, dass die verwaisten Migrationen erfolgreich entfernt wurden.

38voto

stackPusher Punkte 5364

Hier ist eine Rechen-Version der psql-Antwort von @medik, die Ihre Datenbank nicht löscht oder etwas Verrücktes tut:

1) Finden Sie Ihre verwaisten Migrationsversionen:

rails db:migrate:status

2) Notieren Sie sich die Versionen der fehlenden Migrationen und gehen Sie in die Datenbank-Konsole:

rails dbconsole

3) Entfernen Sie nun die Versionen manuell aus der Migrations-Tabelle:

delete from schema_migrations where version='[version_number]';

19voto

spandata Punkte 363

Bearbeiten: DER FOLGENDE VORGANG WIRD IHRE DATENBANK LÖSCHEN

Ein einfacherer Ansatz, der für mich funktioniert hat (beachten Sie, dass dieser Befehl die Datenbank löschen wird und alle Ihre Daten verloren gehen):

rake db:migrate:reset

..und dann:

rake db:migrate:status

Die Verwaisten sollten verschwinden.

5voto

Evseev Vadim Punkte 314

Neue Dateien mit Namen wie 20130320144219_migration_1 erstellen füge etwas leeren Code ein

class Migration1 < ActiveRecord::Migration 
  def change; end 
end 

und führe den Befehl rails db:migrate:down VERSION=20130320144219 aus und schließlich - entferne diese Dateien

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X