Ir al contenido principal
Laravel, shipping fast.

La regla: revertir código y revertir un esquema son dos operaciones distintas, y tratarlas como una es cómo un incidente de cinco minutos se convierte en uno de cinco horas.

Revertir el código, si desplegaste por versiones, es casi instantáneo. El directorio de la versión anterior sigue en disco con todas sus dependencias ya instaladas. Revertir significa volver a apuntar el enlace simbólico, el mismo intercambio atómico que te metió en la versión nueva, ejecutado al revés.

Revertir un esquema no es instantáneo y no es seguro por defecto, porque los métodos down() se escriben para deshacer una migración limpiamente, no para deshacerla mientras una versión antigua a medio desplegar podría depender de lo que esa migración acaba de quitar.

// Bad: treating schema rollback as part of the same motion as a code rollback
php artisan migrate:rollback --step=1
# then swap the symlink back to the previous release

El problema no son los comandos: ambos son reales y ambos funcionan. El problema es el orden y la suposición que hay detrás. Si algo escribió una fila usando las columnas nuevas entre el despliegue y la reversión, ese migrate:rollback ejecuta un dropColumn y esos datos no están revertidos: están perdidos. Has cambiado un fallo por pérdida de datos.

// Good: roll the code back, leave the schema alone
# swap the symlink back to the previous release
# the additive columns stay -- the old release never read them, so their
# presence changes nothing it does

Como las migraciones anteriores eran aditivas, a la versión antigua le da igual que license_at exista: nunca la buscó. Revertir el código basta para detener la hemorragia. El esquema se queda donde está, y si genuinamente necesita cambiar, eso es una migración nueva hacia delante, escrita con calma, no un down() ejecutado bajo la presión de un incidente contra una base de datos de cuyo estado nadie está del todo seguro.

Dentro de seis meses, cuando alguien de tu equipo esté depurando un aviso a las dos de la mañana, no recordará cuáles de tus migraciones son seguras de revertir y cuáles borran algo calladamente. No le hagas adivinar. Migraciones aditivas y sólo hacia delante significan que la respuesta siempre es la misma: revierte el código primero, y normalmente ya has terminado.