Insertando y actualizando grandes cantidades de registros en Odoo
Y explorando odoo_csv_import
Uno de los problemas de performance con los que nos encontramos es la velocidad en la migración de datos. Este es el escenario. Necesitamos crear/actualizar decenas de miles de registros en Odoo y sinceramente Odoo a simple vista no ofrece una solución para este problema. Que hacemos frente a esta situación? Una solución a medias es XMLRPC o en su defecto jsonRPC. Ambos permiten cargar datos en forma masiva, pero no son una solución sustentable ya que ambos tienen que pasar por el ORM lo cual lo vuelve lento frente a miles de registros.
Importar mediante el wizard de importación es una solución suicida. Realmente el importador de Odoo no soporta transformaciones y no tenemos control sobre el proceso de importación. Ademas... apenas superamos el timeout del cliente web, tenemos un error.
Para importar datos en Odoo la verdad no existe un "silver bullet" pero hay buenas herramientas. La mejor que encontré hasta este momento es odoo_csv_import (la cual dicho sea de paso tiene una de las mejores documentaciones posibles para proyectos de Odoo). Igual de esta herramienta ya hablamos anteriormente. Valga decir que por ejemplo actualizo/inserto 336 proveedores en cinco segundos.
De lo que queremos hablar es sobre como lo hace. Que le permite a esta herramienta ser tan rápida. En realidad para entender a odoo_csv_import primero hay que saber que es una herramienta de carga de datos. La extracción y transformación de los datos deben ser realizados previamente. De estos dos pasos se debe generar un archivo de texto con formato csv. Y se debe prestar mucha atención al manejo de los campos many2one. Para esto es fundamental entender como Odoo maneja los external_ids y como actualizarlos en caso de que los mismos no esten presentes en el sistema.
Ahora, que le permite a esta herramienta ser tan rápida? Esta en Odoo mismo. En Odoo cada modelo tiene un método llamado load. Dicho método recibe dos parámetros: fields y data. Los cuales tienen la lista de campos a actualizar (entre los que de debe encontrar el ID, el cual refleja el external/id del registro) y la lista de datos a actualizar/insertar. Lo que es interesante del método, saltea el ORM. Lo hace todo mediante SQL y controla el intervalo de los COMMIT. Es por ello que es muy rápido. Lo cual tiene su lógica. El ORM es buenísimo para mantener la integridad de los datos durante las transacciones. Pero durante la carga masiva de datos, juega en contra. Es por ello que uno antes debe encargarse de la integridad mediante los external/IDs. Es un problema similar a los que se enfrentan las bases de datos (que para cargar masivamente datos, deshabilitan la integridad referencial y la actualización de índices).
Recapitulando... si deben insertar/actualizar grandes volumenes de datos recomiendo estudien odoo_csv_import. Quiza no sea la solución ideal, pero les va a dar unas cuantas ideas sobre como resolver el problema de la performance en la carga. Y no crean en soluciones que son "silver bullet". No existen. Migrar datos a Odoo es una tarea ingrata, penosa y ardua, con pocas recompensas.
Acerca de:
Gustavo Orrillo
Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.