Re: plpython

From: "Guillermo E(dot) Villanueva" <guillermovil(at)gmail(dot)com>
To: Photon <photon(at)rtsystems(dot)com(dot)ar>
Cc: pgsql-es-ayuda <pgsql-es-ayuda(at)postgresql(dot)org>, Martin Diaz <mardiaz28(at)yahoo(dot)com(dot)ar>
Subject: Re: plpython
Date: 2015-09-21 23:44:17
Message-ID: CANm+PCCM6e4epP9y8=Pw1pSzS8ykRLA7AKWJfa5jSi8+fPVoNw@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda

Muchas gracias por tu ayuda! excelente.
Se que puedo resolverlo con plpgsql. Trataba de resolver esto porque
justamente estoy haciendo un paralelismo de resolución de problemas en
plpgsql vs plpython en una cátedra de bases de datos. La intención es que
los alumnos conozcan otros lenguajes procedurales.
En plpgsql se pueden utilizar varios return query o return next en una
misma función y trataba de hacer algo similar.

Aprovecho para preguntar: en python el punto también concatena? está en tu
ejemplo junto a .format(id) que hace format()?

De nuevo muchas gracias!
Saludos.
Guillermo

El 21 de septiembre de 2015, 20:23, Photon <photon(at)rtsystems(dot)com(dot)ar>
escribió:

> Hola Guillermo,
>
> El problema es que el resultado de plpy (variable res) es un objeto
> iterable como un cursor del tipo "PLyResult" no le puedes agregar
> simplemente una lista o diccionario.
>
> Puedes castizar el resultado a una lista haciedo list(rest) y luego si
> hacer el append, pero no es óptimo respecto del uso de memoria ya que esa
> convirtiendo todo el resultado dentro de una variable tipo list, quedaría
> algo así la funcion
>
>
> create or replace function fn_detalle(id integer)
> returns table(orderid integer, category text, title text) as
> $$
> res = plpy.execute('select orderid,category,title from orderlines inner
> join products using (prod_id)where orderid = '+str(id))
>
> #cambio el nombre del variable del diccionario, porque en el ejemplo usas
> "dict" que es una palabra reservada python, no debes usarla.
> d ={"orderid":123,"categgory":"prueba","title":"Título"}
>
> lista_res = list(rest)
> lista_res.append(d)
>
> return lista_res
> $$
> LANGUAGE plpython3u;
>
>
> Supongo en tu caso es un ejemplo simplificado de la función para
> ejemplificar el problema,
> Porque sino lo mas simple creo es agregar el registro como un "union" al
> query que ejecutas. quedaría asi
>
> create or replace function fn_detalle(id integer)
> returns table(orderid integer, category text, title text) as
> $$
>
> query = """select orderid, category, title
> from orderlines
> inner join products using (prod_id)
> where orderid = {0}
> union
> select 123, 'preba', 'Titulo'
> """.format(id)
>
> res = plpy.execute(query)
>
> return res
> $$
> LANGUAGE plpython3u;
>
> y aun mas, creo que no necesitas en el ejemplo usar plpython, lo puedes
> resolver con una simple función plpgsql.
>
> create or replace function fn_detalle(id integer)
> returns table(orderid integer, category text, title text) as
> $$
>
> return query select orderid, category, title
> from orderlines
> inner join products using (prod_id)
> where orderid = id
> union
> select 123, 'preba', 'Titulo'
>
> $$
> LANGUAGE plpgsql;
>
>
> Espero sea de ayuda.
>
>
> El 21/09/15 a las 18:43, Guillermo E. Villanueva escribió:
>
> Buenas tardes, en una función python que devuelve una tabla, ¿*cómo hago
> para agregar líneas al conjunto de resultados*?
> Suponiendo que el resultado de una consulta es una lista de diccionarios,
> intenté agregar un dicc a la lista, pero no funciona.
> Mi intento fue así:
> create or replace function fn_detalle(id integer)
> returns table(orderid integer, category text, title text) as
> $$
> res = plpy.execute('select orderid,category,title from orderlines inner
> join products using (prod_id)where orderid = '+str(id))
> dict={"orderid":123,"categgory":"prueba","title":"Título"}
> res.append(dict)
> return res
> $$
> LANGUAGE plpython3u;
>
> luego el llamado a la función así:
> select orderid,category,title from fn_detalle(16)
>
> y el error obtenido es:
> ERROR: AttributeError: 'PLyResult' object has no attribute 'append'
> CONTEXT: Traceback (most recent call last):
> PL/Python function "fn_detalle", line 4, in <module>
> res.append(dict)
> función PL/Python «fn_detalle»
>
> También probé utilizando contatenación de la siguietne manera:
> res=res+dict
> Pero obtengo otro error:
> ERROR: TypeError: unsupported operand type(s) for +: 'PLyResult' and
> 'dict'
> CONTEXT: Traceback (most recent call last):
> PL/Python function "fn_detalle", line 4, in <module>
> res=res+dict
> función PL/Python «fn_detalle»
>
>
>

In response to

  • plpython at 2015-09-21 21:43:39 from Guillermo E. Villanueva

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message jvenegasperu . 2015-09-22 17:42:42 capturar valores de campos en variables usando consulta espacial
Previous Message Guillermo E. Villanueva 2015-09-21 21:43:39 plpython