it-swarm.com.de

Wie lassen sich verwaiste Rails-Migrationen am besten lösen?

Ich habe zwischen Zweigen 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  Change columns in traffic capture
   up     20130311155109  Remove log settings
   up     20130311160901  Remove log alarm table
   up     20130320144219  ********** NO FILE **********
   up     20130320161939  ********** NO FILE **********
   up     20130320184628  ********** NO FILE **********
   up     20130322004817  Add replicate to root settings
   up     20130403190042  ********** NO FILE **********
   up     20130403195300  ********** NO FILE **********
   up     20130403214000  ********** NO FILE **********
   up     20130405164752  Fix ap hostnames
   up     20130410194222  ********** NO FILE **********

Das Problem ist, dass rake db:rollback wegen der fehlenden Dateien überhaupt nicht funktioniert ...

Was kann ich tun, um ein Rollback durchzuführen und die NO FILE-Nachrichten zu löschen?

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

28
Adrian

Am Ende habe ich das Problem so gelöst:

(1) Gehen Sie zu den Zweigen mit den Migrationsdateien und führen Sie einen Rollback durch. Dies ist nicht trivial, wenn Sie viele Zweige haben, die zu Konflikten führen, wenn Sie versuchen, sie zusammenzuführen. Daher benutze ich diese Befehle, um herauszufinden, zu welchen Zweigen jede Verwaiste Migration gehört.

Ich muss also feststellen, wann die Migration zuletzt geändert wurde.

git log --all --reverse --stat | grep <LASTEST_Orphan_MIGRATION_ID> -C 10

Ich nehme den Festschreibungshash und bestimme, zu welchem ​​Zweig er so gehört:

git branch --contains <COMMIT_HASH>

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

(2) Migrationen ausführen: Wählen Sie den Zweig aus, an dem Sie schließlich arbeiten möchten, und führen Sie die Migrationen aus.

Fehlerbehebung

Ich habe auch ausgeführt, dass in einigen Fällen verwaiste Migrationen in gelöschten Zweigen stattfanden.

Um dieses Problem zu lösen, habe ich Dummy-Migrationsdateien mit der gleichen migrations-ID der fehlenden Dateien erstellt und sie zurückgesetzt. Danach konnte ich die Dummy-Migrationen löschen und habe einen sauberen Migrationsstatus :)

Eine andere Alternative besteht darin, die fehlenden Dateien direkt aus der Datenbank zu löschen:

delete from schema_migrations where version='<MIGRATION_ID>';
48
Adrian

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

Beispiel für Postgres:

  1. Öffne psql:

    psql
    
  2. Verbinden Sie sich mit Ihrer Datenbank:

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

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

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

    DELETE FROM schema_migrations WHERE version IN (<version list as above>);
    

Wenn Sie nun bundle exec rake db:migrate:status ausführen, werden die verwaisten Migrationen erfolgreich entfernt.

21
medik

Bearbeiten: Wie in den Kommentaren gesagt, wird Folgendes WIRD DATENBANK DATENBANK

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

rake db:migrate:reset

..und dann:

rake db:migrate:status

Die Waisenkinder sollten verschwinden.

15
spandata

Sie können die beiden Zweige wieder mit dem Master zusammenführen, damit alle Migrationen verfügbar sind. Wenn Sie diese Migrationen wirklich nicht möchten, aber einen Rollback ausführen möchten, können Sie die Tabelle schema_migrations in Ihrer Datenbank bearbeiten, um die Zeilen zu entfernen, die den Migrationen entsprechen, für die Sie keine Dateien haben. Dies führt jedoch zu Problemen, wenn Sie dann zu einem anderen Zweig mit anderen Migrationen wechseln.

0
Whit Kemmey

Hier ist eine Rake-Version der psql-Antwort, mit der Sie weder Ihre Datenbank löschen noch etwas Verrücktes tun können:

1) Finden Sie Ihre verwaisten Migrationsversionen:

Rails db: migrate: status

2) Notieren Sie sich die Versionen der fehlenden Migrationen und rufen Sie die Datenbankkonsole auf:

Schienen dbconsole

3) Entfernen Sie nun die Versionen manuell aus der Migrationstabelle:

lösche aus schema_migrations wobei version = '[version_number]';

0
stackPusher

Wenn Sie davon ausgehen, dass Sie Git verwenden, sollte es relativ einfach sein, diese Migrationen in Ihren aktuellen Zweig zu übernehmen. Wenn Sie ein bestimmtes Commit haben, aus dem Sie eine Datei erstellen möchten, können Sie Folgendes verwenden:

git checkout <commit hash> <file_name>

(Danke an diese Antwort )

Alternativ können Sie aus einem bestimmten Zweig HEAD auschecken:

git checkout <branch name> -- <file_name>

Nach diesem Blogbeitrag

Angenommen, es handelt sich hierbei tatsächlich um die Versionen der Migrationen, die in der Datenbank ausgeführt werden, sollte ein Rollback möglich sein.

0
mikeryz

Wenn die Migrationsdateien wirklich fehlen (z. B. Ausführen der Migration, vergessenes Rollback der Migration, dann Löschen der Migrationsdatei vor dem Festschreiben), konnte ich die fehlende Migration wie folgt reproduzieren:

  1. gehen Sie zurück in git history, um eine Kopie der schema.rb-Datei zu erhalten, und speichern Sie sie außerhalb von git repo (git log; git checkout xxxxxx; cp schema.rb ~/schema_old.rb, git checkout master)).
  2. führen Sie einen Diff für die beiden Dateien aus und kopieren Sie die Migrationsbefehle in eine Migrationsdatei, die der fehlenden Migrations-ID entspricht (diff schema.rb ~/schema_old.rb > migration_file.rb; vi migration_file.rb). 
  3. Überprüfen Sie den Migrationsstatus und das Rollback (rake db:migrate:status; rake db:rollback; rake db:migrate:status;).
0