<div dir="ltr"><div><div>Chiedo venia, avrei potuto risparmiarti una mail, non avevo capito il funzionamento del GROUP BY nella query, ci sono arrivato dopo che GROUP BY 1, 2 è equivalente a GROUP BY <a href="http://u.id">u.id</a>, <a href="http://u.name">u.name</a> :)<br><br></div>Grazie per tutte le indicazioni, ora che mi hai mostrato che a) si può fare b) come si fa ho tutte le informazioni necessarie per divertirmi!<br><br></div>Alberto<br><div><div><div><div class="gmail_extra"><br><div class="gmail_quote">2014-10-16 16:32 GMT+02:00 Daniele Varrazzo <span dir="ltr"><<a href="mailto:piro@develer.com" target="_blank">piro@develer.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>On 2014-10-16 15:08, Alberto Granzotto wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Ciao Daniele, grazie per la esaustiva risposta, mi sembra tutto chiaro a<br>
parte una cosa -><br>
<br>
2014-10-16 15:47 GMT+02:00 Daniele Varrazzo <<a href="mailto:piro@develer.com" target="_blank">piro@develer.com</a>>:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 2014-10-16 13:59, Alberto Granzotto wrote:<br>
[...]l as (id integer, email text);<br>
<br>
e riscrivi la tua query in maniera da resitiuire un array di questi tipi:<br>
test=> select <a href="http://u.id" target="_blank">u.id</a>, <a href="http://u.name" target="_blank">u.name</a>, array_agg((<a href="http://e.id" target="_blank">e.id</a>, e.email)::t_email) from<br>
users u join emails e on <a href="http://u.id" target="_blank">u.id</a> = e.user_id group by 1,2;<br>
<br>
</blockquote>
<br>
C'è modo di evitare il group by? O devo prima estrarmi tutti gli id delle<br>
email associate allo specifico user e poi usarle nel group by? Cosa succede<br>
se invece di estrarre un solo user volessi estrarre N user?<br>
</blockquote>
<br></div></div>
Il group by e' necessario per usare array_agg: se non lo usi hai i dati di ogni utente ripetuti se un utente ha piu' di una email (come nella tua query originale). Puoi usare una sottoquery che crea una mappa id_utente -> array di t_email e fare il join di questa con gli utenti, ma un group by (sebbene piu' efficiente) ci vuole sempre, es. nella sottoquery.<br>
<br>
In linea generale, psycopg ti restituira' un oggetto per ogni record che Postgres genera: i gradi di liberta' sono nel record generato da postgres (quindi e.g. usare group by, creare array, strutture, dizionari, ecc. usando i tipi di postgres in maniera un po' piu' avanzata) e nel configurare il mapping tra i record letti e gli oggetti python creati da psycopg (giocando con i typecaster). Se esci da questo framework (un record -> un oggetto) allora devi fare qualcosa a valle di psycopg, quindi ti ritrovi con i tipi di algoritmi ripetitivi per cui hai scritto la mail in primo momento: iterare sugli utenti, controllare se li avevi gia' letti, metterli in un dict con una lista di email vuote, aggiungere una email...<br>
<br>
Quindi, detto questo, come mai vuoi evitare il group by? Ti aspetti di leggere i dati da postgres in una maniera che non ho capito (nel qual caso fammi un esempio) oppure ti aspetti un comportamento di psycopg che esula dal restitiure un oggetto per ogni record?<br>
<br>
Estrarre N utenti si fa esattamente come sopra: la query restituisce un record per utente, ognuno con la lista delle sue email, e puoi iterare sul cursore in tutti i modi che psycopg offre (fetchmany(), fetchall(), for record in cur:...)<br>
<br>
    test=> insert into users (name) values ('daniele');<br>
    INSERT 0 1<br>
    test=> insert into emails (user_id, email) values (2, 'piro@officine');<br>
    INSERT 0 1<br>
    test=> insert into emails (user_id, email) values (2, 'piro@develer');<br>
    INSERT 0 1<br>
<br>
    In [20]: dcur.execute("select <a href="http://u.id" target="_blank">u.id</a>, <a href="http://u.name" target="_blank">u.name</a>, array_agg((<a href="http://e.id" target="_blank">e.id</a>, e.email)::t_email) as emails from users u join emails e on <a href="http://u.id" target="_blank">u.id</a> = e.user_id group by 1,2")<br>
<br>
    In [21]: dcur.fetchall()<br>
    Out[21]:<br>
    [{'emails': [<span><br>
        {'email': '<a href="mailto:alberto@example.org" target="_blank">alberto@example.org</a>', 'id': 1},<br>
        {'email': '<a href="mailto:alberto@lemonparty.org" target="_blank">alberto@lemonparty.org</a>', 'id': 2}],<br>
      'id': 1,<br></span>
      'name': 'alberto'},<br>
     {'emails': [<br>
        {'email': 'piro@officine', 'id': 4},<br>
        {'email': 'piro@develer', 'id': 5}],<br>
      'id': 2,<br>
      'name': 'daniele'}]<div><div><br>
<br>
<br>
-- Daniele<br>
______________________________<u></u>_________________<br>
Python mailing list<br>
<a href="mailto:Python@lists.python.it" target="_blank">Python@lists.python.it</a><br>
<a href="http://lists.python.it/mailman/listinfo/python" target="_blank">http://lists.python.it/<u></u>mailman/listinfo/python</a><br>
</div></div></blockquote></div><br></div></div></div></div></div>