¿Cómo revierte una migración fallida de rieles? 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 topado con esto algunas veces y es muy frustrante. Aquí está una prueba simple que hice para duplicar el problema:Recuperación de una migración fallida de Rails
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: 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)
bien, deja rollo de nuevo:
$ rake db:rollback == AddLevelsToRoles: reverting =============================================== -- remove_column(:roles, :level) -> 0.0778s == AddLevelsToRoles: reverted (0.0779s) ======================================
eh? esa fue mi última migración antes de SimpleTest, no la migración fallida. (Y, oh, sería bueno si la salida de la migración incluido el número de versión.)
Así que vamos a tratar de ejecutar el SimpleTest abajo para la migración ha fallado:
$ rake db:migrate:down VERSION=20090326173033 $
No pasa nada, y no hay salida tampoco. Pero tal vez se ejecutó la migración de todos modos? Entonces, solucionemos el error de sintaxis en la migración SimpleTest e intentemos ejecutarlo nuevamente.
$ 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)
Nope. Obviamente, la migración: hacia abajo no funcionó. No está fallando, simplemente no se está ejecutando.
No hay manera de deshacerse de esa tabla duplicada que no sea acceder manualmente a la base de datos y eliminarla, y luego ejecutar la prueba. Tiene que haber una mejor manera que eso.
Excelente, gracias. Haré nuevos proyectos con PGSQL, así que es bueno saber que es una opción. –
Esta sigue siendo la mejor respuesta, por lo que esta merece la recompensa. – nathanvda