Saltar al contenido

El problema sin vuelta atrás

Cambiar el esquema cuando la base vive en máquinas ajenas. Por qué no se parece a migrar un servidor, y las cuatro reglas que lo hacen soportable.

Las cinco diferencias

La segunda fila es la que más código cambia y la cuarta es la que más miedo debería dar: una migración que falla en escritorio no es un incidente que se arregla, es un usuario con sus datos inaccesibles y una aplicación que no abre.

Las cuatro reglas

La regla 2 es la que más se incumple y la que produce los desastres: alguien encuentra un error en la migración 7, la corrige, y publica. Los usuarios que ya la aplicaron tienen una base con el resultado antiguo; los nuevos, con el corregido. Ahora hay dos esquemas distintos con el mismo número de versión y no hay forma de distinguirlos.

Lo que no se puede deshacer

Y conviene tenerlo presente al diseñar el cambio:

  • Borrar una columna borra sus datos. No hay vuelta atrás, y en la máquina de un usuario tampoco hay quien la pida.
  • Cambiar el tipo de una columna puede perder precisión en la conversión.
  • Y fusionar dos tablas en una pierde la información de cuál era cuál, salvo que la guardes explícitamente.

La costumbre que salva: cuando un cambio destruye información, no destruirla en la misma versión. Dejar la columna vieja sin usar durante unas cuantas versiones y borrarla más adelante, cuando ya se sabe que la nueva funciona. Ocupa un poco de espacio y da la vuelta atrás que el escritorio no tiene.

Las migraciones hacia atrás

Una pregunta que aparece siempre: ¿hay que escribir la migración inversa?

En escritorio, casi nunca merece la pena. El caso que justificaría una migración hacia atrás es que el usuario vuelva a una versión anterior de la aplicación, y eso ocurre poco y se resuelve mejor de otra forma: que la versión anterior detecte que la base es más nueva de lo que entiende y lo diga claramente, en vez de intentar leerla y romper cosas.

Rust
if version_de_la_base > VERSION_QUE_ENTIENDO {    return Err(Error::BaseDeVersionPosterior);   // y un mensaje que lo explique}

Esas cuatro líneas valen más que un juego completo de migraciones inversas, y son las que impiden que una versión vieja corrompa una base nueva.