Was ist die beste Art und Weise zu lösen Schienen verwaist Migrationen?
Ich habe die Umschaltung zwischen den Zweigen, die in einem Projekt und jeder von Ihnen haben verschiedene Migrationen... das 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 rake db:rollback
überhaupt nicht arbeiten, weil die fehlenden Dateien...
Was muss ich tun, um in der Lage sein, ein rollback wieder und loszuwerden, die KEINE DATEI-Nachrichten?
Btw rake db:reset
oder rake db:drop
keine option sind, kann ich nicht verlieren Daten aus anderen Tabellen...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Landete ich das problem lösen, wie dieses:
(1) Gehen, um die Zweige, das die migration von Dateien und Rollen Sie zurück. Dies ist nicht trivial, wenn Sie haben viele Zweige, die wird dazu führen, dass viele Konflikte, wenn Sie versuchen, diese zusammenzuführen. Also ich benutze diese Kommandos, um herauszufinden, die Zweige jedes Waisenkind migration gehört.
So, ich muss commit der letzten Zeit war die Zuwanderung verändert.
Nehme ich den commit-hash und bestimmen Sie, welche Abteilung es gehört wie diese:
Dann kann ich wieder zu dieser Filiale, einen rollback und wiederholen Sie diesen Vorgang für alle Dateien fehlen.
(2) Ausführung von Migrationen: Kasse der Filiale schließlich arbeiten möchten, und führen Sie die Migrationen und Sie sollten gut zu gehen.
Fehlersuche
Ich lief auch in einigen Fällen, in denen verwaiste Migrationen, wo auf gelöschte Zweige.
Um dieses Problem zu lösen, die ich erstellt dummy-migration-Dateien mit dem gleichen migration_id die fehlenden Dateien und Rollen Sie zurück. Danach war ich in der Lage, löschen Sie die dummy-Migrationen und haben eine saubere migration-status 🙂
Andere alternative ist das löschen des fehlenden Dateien direkt aus der Datenbank:
delete from schema_migrations where version='<MIGRATION_ID>';
rails dbconsole
rails db
wie ich, hatte Sie auch das gleiche von rails-Konsole wie:sql = "delete from schema_migrations where version='<MIGRATION_ID>';"
und dannActiveRecord::Base.connection.execute(sql)
Migrationen sind in Ihrer Datenbank gespeichert. Wenn Sie möchten, entfernen Sie die verlassenen Migrationen, entfernen Sie Sie aus der db.
Beispiel für Postgres:
Open psql:
Verbindung mit Ihrer db:
Wenn du neugierig bist, Anzeige schema_migrations:
Wenn Sie neugierig sind, überprüfen Sie, ob die verlassenen Migrationen vorhanden sind:
Löschen:
Nun, wenn Sie ausführen
bundle exec rake db:migrate:status
sehen Sie die verwaiste Migrationen wurden erfolgreich entfernt.Edit: Wie gesagt in den Kommentaren, die folgenden FALLEN WIRD IHRE DATENBANK
Einen einfacheren Ansatz, der für mich gearbeitet hat (beachten Sie, dass dieser Befehl löschen Sie die Datenbank und alle Daten gehen verloren):
rake db:migrate:reset
..und dann:
rake db:migrate:status
Den orphan(s) sollten verschwinden.
Davon aus, dass du mit Git, es sollte relativ einfach zu greifen sind diese Migrationen und bringen Sie in den aktuellen branch. Wenn Sie eine bestimmte commit-Sie möchten eine Datei aus, die Sie verwenden können:
(Dank diese Antwort)
Alternativ können Sie sich aus einem spezifischen Zweig KOPF:
Gemäß dieser blog-post
Vorausgesetzt, diese sind in der Tat, die Versionen der Migrationen auf der Datenbank ausgeführt werden, sollten Sie gut sein, für den ein rollback ausgeführt.
Könnte man die Zusammenführung der beiden Zweige wieder in den Stamm, so dass Sie alle Migrationen zur Verfügung. Wenn Sie wirklich nicht wollen, dass diese Migrationen gibt, aber wollen in der Lage sein zu Rollen zurück, die Sie Bearbeiten könnten die schema_migrations Tabelle in Ihrer Datenbank zu entfernen, die entsprechenden Zeilen auf die Migration, für die Sie nicht haben-Dateien. Dies führt jedoch zu Problemen, wenn du dann wechseln Sie zu einem anderen Zweig mit unterschiedlichen Migrationen.
Wenn die migration-Dateien sind wirklich fehlt (z.B. lief die migration, vergessen haben, zurücksetzen der migration, dann gelöscht migration-Datei vor commit), ich war in der Lage zu reproduzieren die fehlende migration wie folgt:
git log; git checkout xxxxxx; cp schema.rb ~/schema_old.rb, git checkout master)
.diff schema.rb ~/schema_old.rb > migration_file.rb; vi migration_file.rb
)rake db:migrate:status; rake db:rollback; rake db:migrate:status;
)Hier ist ein rake-version von psql Antwort, das löschen, wird nicht die db oder etwas tun, was verrückt:
1) Finden Sie Ihre verwaiste migration Versionen:
rails db:migrate:status
2) Hinweis: die Versionen der fehlenden Migrationen und den Kopf in die db-Konsole:
rails dbconsole
3) entfernen Sie Nun die Versionen aus der migration-Tabelle manuell:
löschen von schema_migrations where version='[Versionsnummer]';