Introducción:
OpenETL es una librería en python de migración de datos de OpenERP S.A. Esta herramienta nos permite realizar todas las operaciones típicas de los ETL (extracción, transformación y carga) con el valor añadido de estar muy bien integrada con OpenERP.
La página web de la librería es https://launchpad.net/openetl
También existe una interfaz gráfica empaquetada como módulo (etl_interface) para OpenERP. Este módulo está en los extra-addons. Aunque desde la interfaz es más sencillo el manejo, este post se centrará en el uso de la librería python.
Instalación:
Para bajar la librería es necesario tener instalado bazaar http://es.wikipedia.org/wiki/Bazaar_(software).
El comando concreto:
bzr branch lp:openetl
Una vez bajada la rama de openerp hay que copiar la carpeta openetl/lib/openetl a la carpeta de librerías de tu sistema. En mi caso /usr/lib/python2.6/ .
Aunque en mi eclipse con PyDev ya tengo configurada esa ruta, Eclipse Indigo parece no pillar la librería a la primera. Para refrescar las librerías accesibles en eclipse hay que entrar en PyDev\Interpreter - Python pulsar sobre Restore Defaults (si ya teníamos configurado el sistema) y después sobre Apply.
Funcionamiento:
La librería se divide en trabajos, componentes, conectores, y transiciones.
- Jobs: Procesos que se pueden ejecutar, pausar y parar.
- Components: Componentes de entrada, salida y transformación. Nos permiten obtener datos y cargar datos en sistemas externos. Los componentes de transformación serán los que adapten los datos antes de realizar la carga final.
- Connectors: Los conectores son los que definen las conexiones con los sistemas externos. Son usados por los componentes. La versión actual de la librería tiene conectores para tratar archivos locales, Openobjects, distintas bases de datos (postgres, mysql, oracle), urls (http, ftp, https, gopher), servicios webs xmlrpc, sugarCRM, distintos servicios de google (gdocs, gcalendar, gblog) y facebook.
- Transitions: Las transiciones son el flujo por el que pasan los datos entre los distintos componentes.
El programador debe definir tantos conectores de entrada como salida necesite, al menos un componente por cada conector, y una transición mínima para pasar los datos de un componente a otro. Al estar los conectores “enlazados” con los componentes, al escribir los datos en el componente se escriben en el sistema externo.
Ejemplo:
Tenemos un sistema OrangeHRM instalado en la empresa con las fichas de recursos humanos que queremos migrar a OpenERP. El personal de recursos humanos ha exportado los datos a formato .csv y nos pide que realicemos la carga de datos a OpenERP.
Lo que tenemos que hacer es crear dos conectores, uno se conectará en local contra el archivo .csv y el otro de tipo XMLRPC se conectará con OpenERP. A continuación definiremos los componentes que almacenarán la información, crearemos las transiciones (una para escribir los datos en el componente final y otra para ordenar los datos) que se ejecutarán y por último lanzaremos la tarea. En el componente de OpenObject definiremos el mapeo de los campos del csv a los campos del objeto erp. Las transiciones se ejecutan de forma secuencial según se hayan definido en el .py.
El código fuente de este ejemplo:
import sys
sys.path.append('..')
import openetl
# Conectores
fileconnector_orange=openetl.connector.localfile('/home/carlos/Escritorio/DatosRRHHOrangeHRM.csv')
ooconnector = openetl.connector.openobject_connector('http://localhost:8069', 'testProject', 'admin', 'admin', con_type='xmlrpc')
# Componentes
csv_in1= openetl.component.input.csv_in(fileconnector_orange,name='Datos de Orange')
oo_out_employee = openetl.component.output.openobject_out(
ooconnector,
'hr.employee',
{'name':'firstName'}
)
sort1=openetl.component.transform.sort('firstName')
# Transiciones
tran1=openetl.transition(csv_in1,sort1)
tran2=openetl.transition(sort1, oo_out_employee)
# Definicion de trabajo y ejecucion
job1=openetl.job([csv_in1,sort1,oo_out_employee])
job1.run()
Para facilitar el ejemplo, he simplificado el número de campos a cargar desde el .csv, los campos con tablas relacionadas, etc. Pero la carga se puede complicar tanto como sea necesaria para que todos los datos estén migrados correctamente.
En la carpeta openetl\examples hay ejemplos de todas las cosas que nos harán falta en el proceso de migrado de datos, pasando desde ejemplos con entradas y salidas múltiples (csv_in_out.py) hasta carga de datos con tablas relacionadas (m2m_into_oo.py). Este ejemplo es bastante interesante, puesto que lee usuarios y grupos de archivos csv y los carga directamente en OpenERP. También hay que destacar los ejemplos de migración de datos desde sugarcrm, facebook, gcalendar, etc.