Wie können Sie eine fehlgeschlagene Rails-Migration zurücksetzen? Ich würde erwarten, dass rake db:rollback
dies die fehlgeschlagene Migration rückgängig macht, aber nein, es wird die vorherige Migration zurückgesetzt (die fehlgeschlagene Migration minus eins). Und rake db:migrate:down VERSION=myfailedmigration
funktioniert auch nicht. Ich bin ein paar Mal darauf gestoßen und es ist sehr frustrierend. Hier ist ein einfacher Test, den ich durchgeführt habe, um das Problem zu duplizieren:
class SimpleTest < ActiveRecord::Migration
def self.up
add_column :assets, :test, :integer
# the following syntax error will cause the migration to fail
add_column :asset, :test2, :integer
end
def self.down
remove_column :assets, :test
remove_column :assets, :test2
end
end
Ergebnis:
== SimpleTest: Migration ================================================ ======== - add_column (: Assets ,: Test ,: Ganzzahl) -> 0,0932s - add_column (: Asset ,: Fehler) Rechen abgebrochen! Ein Fehler ist aufgetreten, alle späteren Migrationen wurden abgebrochen: falsche Anzahl von Argumenten (2 für 3)
ok, lass es uns zurückrollen:
$ rake db: Rollback == AddLevelsToRoles: Zurücksetzen ============================================= == - remove_column (: Rollen ,: Ebene) -> 0,0778 s == AddLevelsToRoles: zurückgesetzt (0.0779s) ======================================
huh? Das war meine letzte Migration vor SimpleTest, nicht die fehlgeschlagene Migration. (Und oh, es wäre schön, wenn die Migrationsausgabe die Versionsnummer enthalten würde.)
Versuchen wir also, den Down für die fehlgeschlagene Migration SimpleTest auszuführen:
$ rake db: migrate: down VERSION = 20090326173033 $
Es passiert nichts und auch keine Ausgabe. Aber vielleicht lief die Migration trotzdem? Beheben wir also den Syntaxfehler in der SimpleTest-Migration und versuchen Sie, ihn erneut auszuführen.
$ rake db: migrate: up VERSION = 20090326173033 == SimpleTest: Migration ================================================ ======== - add_column (: Assets ,: Test ,: Ganzzahl) Rechen abgebrochen! MySQL :: Fehler: Doppelter Spaltenname 'Test': ALTER TABLE` Assets` ADD` Test` Int (11)
Nee. Offensichtlich hat die Migration: down nicht funktioniert. Es scheitert nicht, es wird einfach nicht ausgeführt.
Es gibt keine andere Möglichkeit, diese doppelte Tabelle zu entfernen, als manuell in die Datenbank zu gehen und sie zu entfernen und dann den Test auszuführen. Es muss einen besseren Weg geben.