Retornando arrays con PlPython
PlPython es un lenguaje procedural (PL) que permite utilizar Python en una base de datos PostreSQL para poder escribir los procedimientos almacenados. En realidad actualmente es un lenguaje no confiado (untrusted). Se puede leer más aquí: PlPythonu.
Si bien Python maneja listas, diccionarios y otras estructuras de datos con bastante simpleza, no encontramos una manera de hacer casting a un array o vector de PostgreSQL. Particularmente, en el ejemplo debajo, se puede ver que implementamos un wrapper para poder utilizar el motor de expresiones regulares de Python, dentro de la DB, ya que tiene algunas cuestiones más avanzadas que el que trae PgSQL por defecto.
Lo que hicimos fue crear una cadena, con la representación serializada de un Array y dejar que haga el casting PgSQL. Les dejo el código para que lo adapten a sus necesidades. En este caso devuelve un vector de TEXT (TEXT[]) con la idea de emular el resultado devuelto por regexp_matches() en plsql. la signatura de la función es esta:
regexp_python(text,text) RETURNS text[] |
-- Function: regexp_python(text, text) -- DROP FUNCTION regexp_python(text, text); CREATE OR REPLACE FUNCTION regexp_python(p_str text, p_ereg text) RETURNS TEXT[] AS $BODY$import re import string m = re.search(p_ereg, p_str,re.I) IF m IS None: RETURN None ELSE: RETURN ('{"'+'","'.join([re.escape(x) FOR x IN m.groups('NULL')])+'"}').REPLACE('"NULL"','NULL')$BODY$ LANGUAGE 'plpythonu' VOLATILE COST 100; ALTER FUNCTION regexp_python(text, text) OWNER TO postgres; |
Los arrays en PgSQL son serializados como una colección de datos entre llaves:
{‘text1′,’text2’}.
Gracias Milton y Daiana por investigar y aplicar todas estas cosas conmigo 😉