jueves, 2 de agosto de 2012

Carga de datos en OpenERP usando OpenETL

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.

lunes, 9 de julio de 2012

Instalando psyco para corregir warning y mejorar velocidad de ejecución python

Hoy al arrancar un proyecto (OpenERP) desde eclipse en modo debug, el sistema me ha mostrado un warning:

warning: psyco not available for speedups (the debugger will still work correctly, but a bit slower)

Buscando por internet he encontrado que psyco es un proyecto alojado en
http://psyco.sourceforge.net/psycoguide/sources.html
Por lo visto este módulo lo que hace es acelerar la ejecución del código python. No es necesario para funcionar, pero sí recomendable.

Para instalarlo en windows encontré la siguiente página (hay archivos ya compilados, pero no los he probado porque mi instalación era ubuntu 10.04).

http://www.voidspace.org.uk/python/modules.shtml#psyco

Para la instalación en linux se puede bajar el código del svn del proyecto:

svn co http://codespeak.net/svn/psyco/dist/ psyco-dist


Y realizar el típico install:
sudo python setup.py install


Según la documentación del proyecto, es necesario tener en el sistema el módulo python-dev
sudo apt-get install python-dev

En mi máquina yo tenía instalada la versión 2.6 de python y todo ha ido bien.

Enlaces recomendados:

- Página de los fuentes del proyecto:
http://psyco.sourceforge.net/psycoguide/sources.html

- Página donde encontré un poco de luz sobre el tema y los enlaces a la versión windows: http://www.insomnihack.com/?p=412

sábado, 1 de octubre de 2011

Hola mundo

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec mi ante, egestas at ultricies ac, luctus ut odio. Curabitur consectetur, eros vitae pulvinar sagittis, dui augue tincidunt metus, id bibendum libero nibh vitae risus. Integer at risus sit amet felis mollis rutrum ut eget leo. Phasellus ac sapien a leo commodo consectetur. Phasellus tristique feugiat tortor, vitae rhoncus sem pellentesque sed. Nullam gravida purus vitae dolor ullamcorper pulvinar. Sed rhoncus arcu at dui adipiscing porttitor. Integer semper purus vitae felis porta luctus. Aliquam condimentum, tellus quis condimentum blandit, quam tortor interdum nibh, quis luctus diam erat vitae tortor. Vivamus adipiscing dui nec magna consequat sit amet eleifend velit eleifend. Suspendisse auctor, est eget ultricies aliquam, nibh turpis imperdiet sem, vel tincidunt mauris arcu eget lacus. Suspendisse dapibus mi vitae diam porttitor semper.

Nombre: Email:
Sed euismod ante id eros ornare in commodo arcu ornare. Integer cursus tortor faucibus quam viverra sed lacinia tortor faucibus. Morbi eu massa ac nisl tempor dapibus et a nulla. Suspendisse orci tortor, tincidunt ac iaculis sed, suscipit eu sapien. Cras ultrices commodo ligula, et suscipit justo molestie a. Etiam fringilla accumsan arcu quis varius. Phasellus laoreet, lorem et varius laoreet, sapien enim pellentesque mi, eu ornare dui tellus id quam. In hac habitasse platea dictumst. Duis dapibus consectetur ante, a mollis augue imperdiet quis. Maecenas lectus nisl, egestas ac rutrum id, pharetra a risus.


  Test
  
    action
    org.apache.struts.action.ActionServlet
    
      config
      /WEB-INF/struts-config.xml
    
    
      debug
      2
    
    
      detail
      2
    
    2
  

  
  
    action
    *.do
  
  
  
    index.html
    index.htm
    index.jsp
    default.html
    default.htm
    default.jsp
  

Cras in lorem ut dolor rhoncus elementum et ac libero. Vivamus ultricies venenatis diam eget luctus. Quisque faucibus, arcu a semper commodo, nulla est laoreet dui, adipiscing bibendum diam sapien in nibh. Aliquam sapien tellus, suscipit in fermentum quis, mattis ac quam. Phasellus lacinia pharetra libero, eu placerat enim porttitor et. Aliquam fermentum felis at eros posuere condimentum. Vivamus diam nisl, dignissim vitae pulvinar et, malesuada tempus enim.
public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  System.out.println("Hola Mundo");
 }

}
Pellentesque pretium sodales vulputate. Praesent eget nisl ligula, et mattis mi. Nullam mi risus, faucibus luctus vulputate in, luctus sed urna.
Related Posts Plugin for WordPress, Blogger...