Activar / Usar plPython en PostgreSQL

Estoy desarrollando un sistema para una empresa, y me pidieron el clásico: “Quiero que en el nombre del proyecto diga blablabla Sep 2011“.

En la BD tengo guardados los datos como date, obvio, el tenía que hacer el traspaso del mes en número a palabra… obviamente una lata. Hacerlo en la aplicación no era un opción tampoco (se imaginan leer la fecha desde la BD, traspasarla, y recién mostrarla?😯 ). Me dio por hacerlo directamente en la BD, como una función. Peeero nunca había hecho nada de nada. Leí varios lenguajes y formas de hacerlo… la cosa más fea que he visto en mi vida😯 DECLARE, BEGIN, END. Nah… simplemente no era lo mio.

Hasta que descubrí cómo re diantres programar las funciones en python ! Y de eso trata el tuto :) 

Lo primero es revisar que tengas la librería para hacerlo. En mi caso (Pardus Linux) lo hice con estos comandos:

whereis postgresql
postgresql: /usr/lib/postgresql /usr/include/postgresql /usr/share/postgresql
cd /ust/lib/postgresql/
ls 

Y entre los archivos, tenía la librería plpython.so necesaria para hacer todo el cuento.

Ahora necesitamos crear algo que maneje la comunicación entre la librería y pgsql. Para eso, creamos una función. Vamos a pgadmin (o por shell) y escribimos lo siguiente:

CREATE FUNCTION plpython_call_handler()
RETURNS OPAQUE AS '/usr/lib/postgresql/plpython.so' LANGUAGE 'C';

Dependiendo de la ruta que tengan para la librería.

Lo siguiente es “crear” el lenguaje dentro de la BD

CREATE LANGUAGE 'plpython' HANDLER plpython_call_handler LANCOMPILER 'PL/pgSQL';

Y listo! Ahora puedo crear la función para el traspaso de mes en números a palabras.

CREATE OR REPLACE FUNCTION mes_palabra(num integer) RETURNS character varying AS $$

 arraymeses = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic']
 return arraymeses[num]
$$
LANGUAGE plpython VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

y para usarla (en mi caso) simplemente hago esto:

SELECT
  proyectos.proyectos_codigo_real,
  (proyectos.proyectos_codigo_comun
  || ' - ' || proyectos.proyectos_desc
  || ' - ' || mes_palabra(EXTRACT
  (MONTH from proyectos.proyectos_inicio)::integer)
  || ' '|| EXTRACT(year from proyectos.proyectos_inicio))
  AS Nombre_Completo
FROM
  public.proyectos
WHERE
  proyectos.proyectos_tipo_proyecto = 3
AND proyectos.proyectos_terminado = FALSE;

teniendo como resultado

Tabla con datos crudos y consulta

Y eso😀

Links que fueron útiles

Acerca de MaritoCares

Ingeniero Informático. Con tendencias a la programación en [C#, VB].NET, Java(Web principalmente...), PHP, JavaScript, algo mínimo de [ruby, python], y el clásico C.
Esta entrada fue publicada en Bases de Datos, Lenguajes, Pardus, PostgreSQL, Python, Sistemas Operativos, Tips y etiquetada , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s