Using composite types in psycopg3

From: Vladimir Ryabtsev <greatvovan(at)gmail(dot)com>
To: psycopg(at)postgresql(dot)org
Subject: Using composite types in psycopg3
Date: 2020-11-10 21:59:31
Message-ID: CAMqTPqm7H4yVk0qGA8=TyTtVsNX88bo8x1BJkHc6vrOVYyW=RQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: psycopg

Hello,

I have tried psycopg3 very briefly and I have a question.

I have a couple of use cases in systems I currently work with
that prevented (or seriously limited) usage of psycopg2, so
I had to use other drivers. This generally relates to accessing
composite types that you can construct on-the-fly in SQL queries.
Consider the following example:

'''
import psycopg2

def get_query(fpath):
with open(fpath, 'rt') as f:
return f.read()

def main():
conn = psycopg2.connect('postgres://user:password(at)host/db')
cur = conn.cursor()
cur.execute(get_query('query.sql'))
result = cur.fetchone()[0]
print(type(result), result)
cur.close()
conn.close()

if __name__ == '__main__':
main()
'''

Where query.sql is:

'''
with test as (
select 1 as id, 'one' val
union all
select 1, 'one more'
union all
select 2, 'two'
)
select array(
select (id, array_agg(val))
from test
group by id
)
'''

psycopg2 returns the 'result' as a basic string, while
in asyncpg and py-postgresql I have structured data
(roughly 'List[Tuple[int, List[str]]]').

I tried the same in psycopg3 and it is little bit better, but
not entirely: it shows the outer list, the tuples inside it,
but the innermost list is still represented as a basic string:
'{one,"one more"}'.

Is it something you are still working on? Any workarounds?

Vladimir

Responses

Browse psycopg by date

  From Date Subject
Next Message Daniele Varrazzo 2020-11-11 00:24:11 Re: Using composite types in psycopg3
Previous Message Rory Campbell-Lange 2020-11-10 21:24:11 Re: psycopg3 and adaptation choices