Tras un susto en producción con una migración que falló, aprendí a mirar con detenimiento cómo Doctrine maneja los errores y qué opciones tengo para recuperarme sin perder la base de datos.
Doctrine Migrations, por defecto, intenta ejecutar cada migración dentro de una transacción cuando la plataforma de base de datos lo permite. Eso significa que si algo lanza una excepción durante la ejecución del método up, la transacción se revierte y la migración no queda marcada como aplicada en la tabla de versiones. En la práctica esto funciona muy bien con PostgreSQL (que soporta DDL dentro de transacciones), pero con MySQL muchas operaciones DDL no son transaccionales y pueden dejar cambios parciales aunque Doctrine detecte el error.
Si una migración falla, lo primero que hago es ver el estado con el comando de migraciones (por ejemplo, doctrine:migrations:status) y revisar la tabla de versiones para saber qué quedó marcado. Si la migración quedó marcada pero la DB está en un estado inconsistente, uso doctrine:migrations:execute --down para intentar revertirla; si la migración no quedó marcada, generalmente puedo corregir la migración y volver a lanzarla. En casos extremos, marco o desmarco versiones manualmente con doctrine:migrations:version --add/--delete para alinear el registro con la realidad y luego aplicar una migración correctiva.
Con el tiempo aprendí a prevenir: generar y revisar el SQL antes de aplicar cambios, dividir migraciones grandes en pasos pequeños y escribir migraciones idempotentes y comprobables. También suelo desactivar la transaccionalidad de una migración (overriding isTransactional a false) cuando sé que voy a ejecutar operaciones no transaccionales y quiero control fino del flujo. Al final, la mezcla de transacciones, comandos de gestión de versiones y buenas prácticas de testing me ha salvado de varios sustos, y siempre termino tranquilizándome con un backup reciente antes de tocar producción.
Me gusta dejar todo documentado, así que cuando me topo con errores en migraciones, sigo un flujo claro que Doctrine facilita bastante.
Primero compruebo el informe del migrator: status me dice qué migraciones están pendientes y cuál es la versión actual. Si una migración falló en mitad de la ejecución, Doctrine normalmente lanza una excepción y, si la plataforma lo admite, revierte la transacción automáticamente. Eso evita que la tabla de versiones quede marcada y que la migración se considere aplicada cuando no lo fue realmente.
Si detecto que hay cambios parciales (muy común en MySQL con ALTER TABLE) procedo con cuidado: intento correr doctrine:migrations:execute --down para ejecutar el down y revertir lo que se pueda; si el down no cubre el caso porque la migración quedó a medias, preparo una migración correctiva que deje la estructura en un estado limpio. En situaciones donde quiero forzar un alineado sin ejecutar SQL, uso doctrine:migrations:version --add o --delete para marcar manualmente la versión. Para evitar problemas, antes de aplicar en producción siempre hago un dry run o genero el SQL para revisarlo, divido migraciones grandes en pasos pequeños y, si es necesario, desactivo la transacción en la migración (isTransactional = false) para ejecutar operaciones que no soporten transacción. Al final, una buena copia de seguridad y migraciones pequeñas salvan muchas noches de insomnio.
He tenido que lidiar con migraciones corruptas más de una vez y lo principal que aprendí es: no confiar ciegamente en que todo se revertirá en todas las bases de datos. Doctrine envuelve las migraciones en transacciones por defecto (si la plataforma lo permite), así que cuando hay una excepción el framework intenta hacer rollback y no marca la versión como aplicada. Pero en motores como MySQL, ciertos DDL no son transaccionales y pueden quedar cambios parciales.
Cuando ocurre un error, reviso la tabla de versiones, intento ejecutar el down de la versión problemática con doctrine:migrations:execute --down, y si eso no arregla la inconsistencia preparo una migración de corrección o, en último recurso, restauro desde el backup. También es útil marcar o desmarcar versiones con doctrine:migrations:version para sincronizar el estado lógico con la realidad. En resumen: transacciones cuando se pueda, migraciones pequeñas y reversibles, revisar SQL antes de aplicar y backups al día; así minimizo el dolor si algo falla.
2026-07-10 10:19:08
8
Toutes les réponses
Scanner le code pour télécharger l'application
Livres associés
No es la heredera que él protegía
Cyathia
10
1.0K
El día en que el primer amor agonizante de mi compañero entró en labor de parto, sus padres apostaron a diez guerreros frente a mi puerta.
Lo hicieron solo para impedir que irrumpiera en la sala de parto y arruinara el nacimiento del heredero del Alfa Kaelen.
Sin embargo, no aparecí. Ni siquiera cuando el llanto de un recién nacido llenó el aire.
Su madre, la antigua Luna, sostuvo la mano de la otra loba y soltó un suspiro de alivio.
—Liana, con nosotros aquí, ¡esa estéril de Elara jamás les hará daño a ti ni al cachorro!
Kaelen secó el sudor de la frente de Liana, con los ojos llenos de adoración.
—No te preocupes. Mi padre tiene hombres vigilando las fronteras de la manada. Si Elara se atreve a causar problemas, ¡la exiliaremos para siempre!
Por fin se relajó al comprobar que yo no iba a venir.
No podía entenderlo. Lo único que quería era darle un hijo, un legado, al primer amor que se estaba muriendo. ¿Por qué no podía yo ser más comprensiva?
Al mirar al cachorro dormido, una sonrisa satisfecha cruzó su rostro.
Pensó que, si yo solo aparecía y le pedía disculpas a Liana, perdonaría todas nuestras peleas anteriores. Incluso estaría dispuesto a consolarme después del parto, quizá hasta me permitiría ser la madre del cachorro solo de nombre, para que pudiera conservar mi título de Luna.
Pero él no lo sabía. Yo acababa de presentar mi solicitud ante el Consejo Supremo.
En una semana, renunciaría a mi estatus dentro de la manada, me iría con los bebés que llevaba en el vientre y no volvería a verlo jamás.
En el quinto aniversario de mi matrimonio con Álvaro Rosales, la tragedia llegó sin aviso: su hermano murió de repente y él tuvo que asumir el papel de Don.
Pero la familia impuso una condición cruel… debía tener un hijo con mi cuñada Sara Olmeda para preservar el linaje.
Me negué. Álvaro también… o eso creí. Aún recuerdo cómo apretó mi mano y prometió:
—Elena, jamás voy a aceptar eso. Solo tú puedes ser la matriarca de la familia Rosales… y nuestro hijo será el único heredero.
Pero con los días, algo cambió. Él regresaba cada vez más tarde, consumido por responsabilidades del clan y con un perfume que no era mío.
Hasta que un video anónimo lo confirmó todo.
Allí estaba él, junto a Sara, en una consulta prenatal. Su mano sobre su vientre… con una ternura que alguna vez fue mía.
—Sara… gracias por darme al heredero de la familia Rosales —le dijo.
Y en ese instante, mi mundo se rompió.
Su promesa ya era ceniza.
Así que hice lo único que me quedaba… incendié el hogar que una vez fue nuestro y me fui sin mirar atrás.
Después de todo, mi padre —el Don de la familia Velasco— llevaba años esperando mi regreso… y había llegado el momento de reclamar lo que siempre fue mío.
La primera decisión que tomé tras renacer fue rechazar el rito de marca con mi compañero Alfa, Ethan. En mi vida anterior, cuando Ethan intentó aplazar nuestra ceremonia de unión por trigésima segunda vez, lo amenacé invocando las leyes sagradas de la Diosa de la Luna.
Al final, Ethan cedió. Para apaciguar mi furia, juró que nada volvería a interrumpirnos. Sin embargo, esa misma noche murió Ivy, su amante Omega.
Desde aquel instante, Ethan me odió con cada fibra de su ser. Cuando le confesé que estaba esperando cachorros, me ahogó en las aguas gélidas del Mar del Norte.
—Tú y la abominación que llevas dentro merecen morir por lo que le pasó a ella.
Me escupió las palabras mientras me hundía la cabeza bajo el agua. Morí sumida en la desesperación. Pero al abrir los ojos, me encontraba de nuevo frente al altar.
Ethan lucía impaciente.
—A Ivy le duele el pecho... Tenemos que posponer la ceremonia de unión otra vez.
Esperaba que le suplicara. En lugar de eso, me desabroché el collar ceremonial y se lo arrojé a la cara.
—Ve con ella. Yo me largo.
Ethan hizo una mueca de desprecio.
—Deja el drama. Sin mi aroma, vas a regresar arrastrándote de rodillas en una semana.
No sabía que, una hora más tarde, yo estaría tocando a la puerta de su enemigo mortal: Damon, el Tirano del Norte.
Cuando publiqué una foto luciendo el anillo del Alfa Winterborn en mi dedo, con la leyenda “Un Alfa Mejor”, Ethan enloqueció...
Firmó nuestra ruptura… mientras planeaba nuestra boda
Bagel
0
2.1K
Tras tres días sin dar señales de vida, mi prometido —el Capo de la familia Moretti— se fue de viaje con su asistente, Bella.
Esperaba que, como siempre, yo me muriera de celos.
Pero cuando regresó a Valmont un mes después… se encontró con alguien completamente distinta.
Me pidió que le cediera mi oficina. No discutí. Recogí mis cosas y se la entregué.
Para hacer brillar a Bella, me dejó en evidencia frente a un socio clave durante la reunión anual de la familia. No me defendí. Acepté el castigo sin decir una palabra.
Cuando decidió ponerla al frente del negocio más rentable… tampoco reaccioné. Le entregué todos los documentos y me aparté.
Bella sonreía con aire triunfante.
—¿Ves? Te lo dije.
—A mujeres como ella hay que saber llevarlas. Con un viajecito basta para que se asuste y vuelva dócil.
Lucas se lo creyó todo. Incluso la elogió por su “gran intuición”.
Después, en un gesto que jamás había tenido conmigo, prometió organizar una boda tan ostentosa que haría historia en el bajo mundo de Valmont.
Pero había olvidado algo.
El acuerdo de ruptura que firmó… justo antes de subirse al coche aquel día.
Yo ya había cortado todos los lazos.
Me iba.
Y él… ni siquiera lo sospechaba.
El día de la sentencia, mi prometido Diego González me tomó de la mano, sollozando, y me pidió que dejara de defender mi inocencia y firmara un acuerdo de culpabilidad.
—Clara, sé que tú no hiciste nada… pero Isabella está esperando un hijo mío. No puedo permitir que ella vaya a la cárcel. Hazlo por tu bien, por favor —suplicó, con lágrimas que le empañaban la mirada.
Sin dudarlo ni un instante, firmé el acuerdo.
En mi vida anterior me negué a cargar con la culpa de Isabella García y, por eso, no solo terminé tras las rejas: la furia de Diego envió gente a torturarme hasta dejarme estéril.
Esta vez me propuse complacerlo.
A la mañana siguiente, los noticieros reventaron con la primicia de que yo había robado secretos comerciales de la Corporación López. Para colmo, Isabella se presentó como testigo.
—Sí, fue ella; la vi con mis propios ojos infiltrarse en la compañía —declaró ante las cámaras.
Pero aquella tarde, cuando inició la audiencia, el demandante Santiago López, director general de la corporación, retiró la acusación. Bajo la mirada atónita de la prensa, sacó un anillo, se arrodilló y me preguntó:
—Clara, ¿en esta vida aceptarías casarte conmigo?
Como la compañera destinada de Loki Whalen, Alfa de la manada Darkshadow, una vez creí que sería su única Luna de por vida.
Hoy, esa mentira se hace añicos.
En el registro de la manada, mi nombre ha sido tachado como compañero de Loki. En su lugar está Maya Hemmings, su verdadero amor, quien, según él, había abandonado la manada hacía años.
La verdad es cruel.
En ese instante, el dolor insoportable del rechazo de mi vínculo me desgarra el alma. Es entonces cuando finalmente comprendo que mi debilidad del año pasado no se debe a la angustia de no haber podido concebir, sino a las consecuencias de la ruptura de nuestro vínculo de compañeros.
Lo que él no sabe es que ayer el sanador me dijo que estoy embarazada de los cachorros gemelos con los que siempre ha soñado.
Como su amor es una mentira, no tengo motivos para quedarme.
Ahora me iré y me llevaré conmigo a sus verdaderos herederos.