Migraciones: cambiar el esquema con seguridad
Tu esquema cambiará: añadirás una columna, renombrarás una tabla, agregarás un índice. Piénsalo como los cambios rastreados de un documento compartido: cada cambio queda registrado en orden, de modo que la copia de todos pueda actualizarse de la misma manera. Una migración es un script versionado y repetible que describe uno de esos cambios. Las migraciones importan porque el esquema en tu laptop, en la laptop de tu compañero de equipo y en producción debe permanecer idéntico.
Las reglas que mantienen las migraciones seguras:
- Nunca edites la a mano en producción. Escribe una migración.
- Las migraciones avanzan hacia adelante. Cada una es un archivo nuevo; no reescribes las antiguas que ya se ejecutaron.
- Haz los cambios destructivos con cuidado. Eliminar una columna o una tabla borra datos de forma permanente. Ten primero una copia de seguridad.
- Los cambios aditivos son los más seguros. Añadir una columna que admite nulos rara vez rompe algo; renombrar o eliminar una puede romper código en ejecución.
Las migraciones forman una cadena ordenada: cada una es un paso numerado que mueve cada copia de la base de datos de un estado conocido al siguiente, de modo que tu laptop, la de un compañero y producción terminan siendo idénticas:
empty DB
│
▼
┌────────────┐ ┌────────────┐ ┌────────────┐ ┌────────────┐
│ 001_init │ ▶ │ 002_add │ ▶ │ 003_index │ ▶ │ 004_bio │
│ users │ │ posts │ │ on author │ │ column │
└────────────┘ └────────────┘ └────────────┘ └────────────┘
apply in order ─────────────────────────────────────────▶ current
never edit a step that already ran — add a NEW one
Herramientas como Prisma, Drizzle o las migraciones de Rails generan y rastrean esto por ti. Déjalas hacerlo.
Una migración tiene dos mitades: el cambio a aplicar (up) y cómo deshacerlo (down). Una herramienta confiable genera ambas, de modo que un despliegue fallido pueda revertirse limpiamente:
-- up: add an optional bio, safe to apply live
ALTER TABLE users ADD COLUMN bio TEXT;
-- down: reverse it
ALTER TABLE users DROP COLUMN bio;
Las migraciones genuinamente peligrosas son los renombrados y los cambios de tipo, porque el código antiguo y el esquema nuevo discrepan brevemente. El patrón profesional es dividirlos en pasos aditivos: añade la columna nueva, rellénala con datos existentes (backfill), cambia el código para leerla y solo elimina la columna antigua en un despliegue posterior, una vez que nada la referencia. Se siente lento, pero es la diferencia entre un lanzamiento sin sobresaltos y un pico de errores de 500 páginas para cada usuario a mitad del despliegue.