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.
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.