La Migración de los Campos Calculados: Cómo Evitar que el Lado Oscuro Borre tu Historia
*Que la fuerza de los datos te acompañe en tu próxima migración*
Hace mucho tiempo, en una galaxia de versiones muy, muy lejana... existía Odoo v16. Los Jedi de la configuración habían creado campos calculados con `stored=True`, y los valores históricos brillaban como estrellas en la base de datos. Pero entonces llegó el Imperio de la Migración — y con él, el riesgo de que todo ese conocimiento ancestral se perdiera en el olvido.
Bienvenido, joven padawan, a una lección que todo maestro de Odoo debería conocer.
🐛 El Problema: Cuando el Recalculo lo Borra Todo
Imaginate esta escena: tenés un campo `x_balance` en `res.partner`, ese que con tanto esmero configuraste para que calcule el saldo entre cuentas por cobrar y por pagar. Funciona perfecto en v16. Los datos históricos están ahí, firmes como un AT-AT en Hoth.
balance = sum(cuenta_por_cobrar) - sum(cuenta_por_pagar)
Pero al migrar a v19... ¡pum! El campo se recalcula desde cero, como si el Emperador hubiera ordenado borrar tu memoria. Los valores históricos desaparecen. Es como si Obi-Wan te dijera "estos no son los datos que estás buscando" — pero en serio, se fueron.
**El síntoma clásico:** Después de la migración, el campo está vacío para registros antiguos. Los reportes financieros del año pasado muestran saldos en cero. El pánico se extiende por la base de datos como el lado oscuro por la galaxia.
🔍 Diagnóstico: Entendiendo al Enemigo
El culpable no es un Sith, es el ciclo normal de instalación de módulos durante una migración. Cuando Odoo migra y reinstala un módulo que define un campo stored computed:
- Recrea la definición del campo
- Borra los valores almacenados (porque la lógica de cómputo "debería" regenerarlos)
- Recalcula... pero solo para registros nuevos o modificados
- Los valores históricos se preservan
- El campo sigue calculándose para registros nuevos
- No hay errores de constraint o tipo de dato
- Ejecutar tu `pre-migrate.py` → los valores se preservan
- Instalar/actualizar el módulo → el campo se redefine
- El recalculo post-migración solo toca registros sin valor (que son... ninguno, porque ya los tenés)
- ✅ Todos los saldos históricos preservados — como si hubieran estado en una cápsula de congelación en carbonita
- ✅ El campo sigue calculándose automáticamente para nuevos movimientos
- ✅ Sin downtime ni reprocesos masivos
- ✅ Sin necesidad de migraciones de datos complejas post-facto
- [Documentación de migraciones de Odoo](https://www.odoo.com/documentation/19.0/es/developer/howtos/upgrade.html)
- [ORM Fields API — stored computed](https://www.odoo.com/documentation/19.0/developer/reference/backend/orm.html#fields)
Es como si la Estrella de la Muerte apuntara a tus datos históricos y el botón de "recalcular" no llegara a cubrir todo el planeta.
**La causa raíz:** El script de migración estándar de Odoo no incluye un paso de preservación de datos para campos stored computed. Y si el campo tiene dependencias que cambiaron entre versiones, el recalculo puede fallar silenciosamente.
🔧 La Solución: Un Plan de los Rebeldes
Como toda buena alianza rebelde, necesitamos un plan antes del ataque. La solución es un script de pre-migración que preserve los valores antes de que el módulo sea reinstalado.
Paso 1: El Script de Backup
Creá un archivo `migrations/19.0.1.1/pre-migrate.py` en tu módulo:
def migrate(cr, version):
"""
Preserva los valores de campos calculados stored
antes de que la migración los borre.
"""
cr.execute("""
UPDATE res_partner
SET x_balance = subquery.old_balance
FROM (
SELECT id, x_balance as old_balance
FROM res_partner
WHERE x_balance IS NOT NULL
) subquery
WHERE res_partner.id = subquery.id
""")
> **Consejo Jedi:** Hacé esto por cada campo stored computed que quieras preservar. Si tenés varios, metelos todos en el mismo script para mantener el orden en la fuerza.
Paso 2: Probá en la Base de Pruebas
Antes de ejecutar la migración real, probá en un duelo de entrenamiento (tu base de staging). Verificá que:
Paso 3: Ejecutá la Migración
Con el script en su lugar, la migración estándar de Odoo va a:
✅ Resultado: La Victoria del Bien
Después de aplicar esta técnica:
**Métrica de éxito:** 100% de los valores históricos intactos, 0% de pánico entre los usuarios financieros.
📚 Para Profundizar
💬 ¡Que la Fuerza te Acompañe!
¿Te pasó algo similar en alguna migración? ¿Descubriste otro truco Jedi para preservar datos históricos? La Alianza Rebelde de desarrolladores Odoo necesita tus conocimientos. Compartí tu experiencia abajo. 🚀
---
*Tipo: feature | Audiencia: tecnico | Tags: Migraciones, Tips y Trucos*
*Artículo generado con el poder del lado claro de la Fuerza*