Jak przywrócić nieudaną migrację szyn? Spodziewałbym się, rake db:rollback
że cofnie to nieudaną migrację, ale nie, cofa poprzednią migrację (nieudana migracja minus jedna). I rake db:migrate:down VERSION=myfailedmigration
też nie działa. Spotkałem się z tym kilka razy i jest to bardzo frustrujące. Oto prosty test, który wykonałem, aby zduplikować problem:
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
wynik:
== SimpleTest: migracja ============================================= ======== - add_column (: asset,: test,: integer) -> 0,0932 s - add_column (: asset,: error) prowizja przerwana! Wystąpił błąd, wszystkie późniejsze migracje zostały anulowane: zła liczba argumentów (2 za 3)
ok, cofnijmy to:
$ rake db: rollback == AddLevelsToRoles: przywracanie =============================================== == - remove_column (: role,: level) -> 0,0778 s == AddLevelsToRoles: przywrócone (0,0779s) ========================================
co? to była moja ostatnia migracja przed SimpleTest, a nie nieudana migracja. (I och, byłoby miło, gdyby dane wyjściowe migracji zawierały numer wersji).
Spróbujmy więc uruchomić wyłączenie dla nieudanej migracji SimpleTest:
$ rake db: migrate: down WERSJA = 20090326173033 $
Nic się nie dzieje i nie ma też wyjścia. Ale może i tak przeprowadził migrację? Więc naprawmy błąd składni w migracji SimpleTest i spróbujmy go ponownie uruchomić.
$ rake db: migrate: up WERSJA = 20090326173033 == SimpleTest: migracja ============================================= ======== - add_column (: asset,: test,: integer) prowizja przerwana! MySQL :: Błąd: zduplikowana nazwa kolumny 'test': ALTER TABLE `asset` ADD` test` int (11)
Nie. Oczywiście migrate: down nie zadziałało. Nie zawodzi, po prostu się nie wykonuje.
Nie ma innego sposobu na pozbycie się tej zduplikowanej tabeli niż ręczne wejście do bazy danych i usunięcie jej, a następnie uruchomienie testu. Musi być lepszy sposób niż to.