¿CÓMO GESTIONAR LOS CAMBIOS DE TIPO DE DATOS DURANTE LAS MIGRACIONES DE ODOO?
Migrar una base de datos Odoo de una versión a otra nunca es solo cuestión de copiar datos y actualizar módulos. Uno de los mayores desafíos que enfrentan los desarrolladores durante la migración es el manejo de los cambios en los tipos de datos de campo entre las diferentes versiones de Odoo.
A medida que Odoo crece con nuevas funciones, mejor soporte multiempresa y un rendimiento optimizado, la estructura interna de los modelos y campos cambia con frecuencia. Estos cambios pueden parecer menores al principio, pero pueden tener un gran impacto en cómo se comportan sus datos existentes después de la actualización.
El caso de account.account (Odoo 15 a 17)
Un buen ejemplo de esto ocurrió durante la migración desde Odoo 15 a Odoo 17.
En Odoo 15, el modelo account.account utilizaba un campo de tipo char (texto simple) llamado code para almacenar el código de la cuenta contable. Esto funcionaba bien para casos de uso básicos.
Sin embargo, a medida que las empresas necesitaban configuraciones multiempresa más avanzadas, Odoo rediseñó este sistema en la versión 17. En lugar de almacenar un único código, Odoo ahora utiliza un campo de tipo JSONB llamado code_store. Este nuevo campo puede almacenar diferentes códigos de cuenta para diferentes empresas en un solo lugar, dentro de una estructura JSON.
Este cambio mejora la flexibilidad y evita la duplicación de registros de cuenta, pero introduce problemas críticos durante la migración. El antiguo valor de texto "1000" no se puede insertar directamente en el nuevo campo JSONB. Si intenta asignarlo sin transformación, Odoo detectará un tipo de datos incorrecto y generará errores como:
TypeError: the JSON object must be str, bytes or bytearray, not dict
Esto sucede porque el nuevo campo espera una estructura JSON válida (un diccionario serializado), no texto simple. Si esta conversión no se realiza con cuidado, puede provocar datos corruptos, registros contables rotos o incluso el fallo total del proceso de migración.
Otro ejemplo: El sistema de seguimiento de correo
Un caso similar es el cambio en el sistema de seguimiento de correo (mail.tracking.value). En versiones recientes, varios campos que solían almacenarse como texto sin formato o campos relacionales se han convertido en campos JSON para optimizar el almacenamiento.
Esto afecta cómo se registran los cambios en el chatter (la zona de mensajes a la derecha de los documentos), cómo se muestran las diferencias y cómo se almacenan los datos internamente. Si los datos antiguos no se convierten al nuevo formato JSON correctamente, es posible que el chatter deje de mostrar el historial de actualizaciones o que Odoo falle al intentar leer valores de registro antiguos.
La importancia de entender el "Por qué"
Estos no siempre son cambios obvios o documentados en grandes titulares. A menudo son "silenciosos" y están ocultos en lo profundo del ORM. Es por eso que los desarrolladores que realizan migraciones no solo deben comprender qué campo cambió, sino también por qué cambió y qué estructura de datos espera el nuevo formato.
Un buen trabajo de migración no se trata solo de escribir scripts de actualización, sino de comprender la lógica detrás del rediseño de Odoo y garantizar que todos los datos antiguos se transformen para ajustarse a la nueva estructura.
Escenario del mundo real: Convirtiendo datos
Supongamos que estás migrando de Odoo 15 a Odoo 17 y necesitas convertir el campo de código heredado (code) en el nuevo campo code_store. Debes tomar el valor de la cadena anterior y envolverlo dentro de una estructura JSON válida, utilizando el ID de la empresa como clave.
Esto se puede hacer en Python usando un script de actualización (post-migration script) o usando SQL directo durante la etapa de migración.
Por ejemplo, usando SQL, podrías convertir un registro donde:
- code = '1000'
- company_id = 1
El objetivo es transformar esto en el nuevo formato JSONB:
- code_store = '{"1": "1000"}'
Esto implica crear el nuevo campo y poblarlo almacenando el valor del campo anterior junto con el ID de la empresa en el formato JSON requerido.
En resumen
Una migración de Odoo fluida depende de prestar mucha atención a cómo han cambiado los tipos de datos de los campos clave entre versiones. Cuando comprendes exactamente qué campos se actualizaron y la razón detrás del cambio, puedes preparar los scripts de transformación de datos correctamente antes de moverlos al nuevo sistema.
Esto evita problemas críticos como registros contables rotos, información faltante en el historial o errores de tipo TypeError inesperados después de la actualización. Al manejar estos cambios con cuidado, se garantiza que todo el sistema continúe funcionando como se espera —desde la contabilidad hasta la mensajería— sin interrupciones. Al final, comprender y adaptarse a estos cambios en la estructura de datos es lo que hace que la migración sea segura, estable y exitosa.