Come si ripristina una migrazione di binari non riuscita? Mi aspetto che il rake db:rollback
annullerebbe la migrazione fallita, ma no, ripristina la precedente migrazione (la migrazione fallita meno uno). E rake db:migrate:down VERSION=myfailedmigration
non funziona neanche. Mi sono imbattuto in questo alcune volte ed è molto frustrante. Ecco un semplice test che ho fatto di riprodurre il problema:Rollback di una migrazione di Rails non riuscita
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
risultato:
== SimpleTest: migrating ===================================================== -- add_column(:assets, :test, :integer) -> 0.0932s -- add_column(:asset, :error) rake aborted! An error has occurred, all later migrations canceled: wrong number of arguments (2 for 3)
ok, lascia rotolare indietro:
$ rake db:rollback == AddLevelsToRoles: reverting =============================================== -- remove_column(:roles, :level) -> 0.0778s == AddLevelsToRoles: reverted (0.0779s) ======================================
eh? quella era la mia ultima migrazione prima di SimpleTest, non la migrazione fallita. (E, oh, sarebbe bello se l'uscita di migrazione incluso il numero di versione.)
Quindi, consente di provare a eseguire il basso per la SimpleTest migrazione non riuscita:
$ rake db:migrate:down VERSION=20090326173033 $
Non succede nulla, e nessuna uscita neanche. Ma forse ha gestito la migrazione comunque? Pertanto, risolviamo l'errore di sintassi nella migrazione di SimpleTest e proviamo a eseguirlo di nuovo.
$ rake db:migrate:up VERSION=20090326173033 == SimpleTest: migrating ===================================================== -- add_column(:assets, :test, :integer) rake aborted! Mysql::Error: Duplicate column name 'test': ALTER TABLE `assets` ADD `test` int(11)
No. Ovviamente la migrazione: down non ha funzionato. Non sta fallendo, non è solo in esecuzione.
Nessun modo per sbarazzarsi di quella tabella duplicata se non quella di accedere manualmente al database e rimuoverlo, quindi eseguire il test. Deve esserci un modo migliore di quello.
Eccellente, grazie. Farò nuovi progetti con PGSQL quindi è bene sapere che è un'opzione. –
Questa è ancora la migliore risposta, quindi questo merita la bozza di imho. – nathanvda