¿Cómo revertir una migración de rieles fallida? Esperaría que rake db:rollback
deshaga la migración fallida, pero no, revierte la migración anterior (la migración fallida menos uno). Y rake db:migrate:down VERSION=myfailedmigration
tampoco funciona. Me he encontrado con esto varias veces y es muy frustrante. Aquí hay una prueba simple que hice para duplicar el problema:
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
resultado:
== SimpleTest: migrando ============================================= ======== - add_column (: activos,: prueba,: entero) -> 0.0932 s - add_column (: activo,: error) rastrillo abortado! Ha ocurrido un error, todas las migraciones posteriores canceladas: número incorrecto de argumentos (2 por 3)
ok, retrocedamos:
$ rake db: rollback == AddLevelsToRoles: revirtiendo =========================================== == - remove_column (: roles,: level) -> 0.0778 s == AddLevelsToRoles: revertido (0.0779s) ======================================
eh esa fue mi última migración antes de SimpleTest, no la migración fallida. (Y, oh, sería bueno si el resultado de la migración incluyera el número de versión).
Así que intentemos ejecutar el down para la migración fallida SimpleTest:
$ rake db: migrate: down VERSION = 20090326173033 PS
No pasa nada y tampoco hay salida. ¿Pero tal vez ejecutó la migración de todos modos? Así que corrijamos el error de sintaxis en la migración de SimpleTest e intentemos ejecutarlo nuevamente.
$ rake db: migrate: up VERSION = 20090326173033 == SimpleTest: migrando =========================================== ======== - add_column (: activos,: prueba,: entero) rastrillo abortado! Mysql :: Error: Nombre de columna duplicado 'prueba': ALTER TABLE `assets` ADD` test` int (11)
No Obviamente, migrate: down no funcionó. No está fallando, simplemente no se está ejecutando.
No hay forma de deshacerse de esa tabla duplicada que no sea ingresar manualmente a la base de datos y eliminarla, y luego ejecutar la prueba. Tiene que haber una forma mejor que esa.