<div dir="ltr"><div><div><div><div><div><div><div>Ciao a tutt*,<br></div>sto giocando un po' con Flask e Psycopg2.<br><br></div>Dopo tanto tempo passato su MongoDB da una parte e Django + ORM dall'altra, mi son rimesso per vari motivi a mettere le mani su SQL e a fare le cose a manina. (Sì, son ben consapevole di tutto quello che comporta, ma non ho assolutamente voglia di lavorare con ORM e company per questo progetto personale).<br><br></div><div>Quello che voglio fare è estrarre dati dal DB con SELECT e serializzare i record in JSON, perché fornisco i dati da un endpoint della API.<br></div><div>Sto usando <a href="http://initd.org/psycopg/docs/extras.html#real-dictionary-cursor" target="_blank">RealDictCursor</a> e va bene per la tupla corrente che mi ritorna la SELECT. Nel caso però volessi fare una JOIN con una o più tabelle le cose cambiano.<br></div><div><br></div>Esempio micro:<br><span style="font-family:courier new,monospace">test=> create table users (id serial primary key, name text);<br>test=> create table emails (id serial primary key, user_id integer references users, email text);<br>test=> insert into users (name) values ('alberto');<br>test=> insert into emails (user_id, email) values (1, '<a href="mailto:alberto@example.org" target="_blank">alberto@example.org</a>');<br>test=> insert into emails (user_id, email) values (1, '<a href="mailto:alberto@lemonparty.org" target="_blank">alberto@lemonparty.org</a>');<br>test=> select * from users inner join emails on (<a href="http://users.id" target="_blank">users.id</a> = emails.user_id);<br><br> id |  name   | id | user_id |         email          <br>----+---------+----+---------+------------------------<br>  1 | alberto |  1 |       1 | <a href="mailto:alberto@example.org" target="_blank">alberto@example.org</a><br>  1 | alberto |  2 |       1 | <a href="mailto:alberto@lemonparty.org" target="_blank">alberto@lemonparty.org</a></span><br><br></div>Ora, lato applicativo Python, quello che faccio è creare un cursore e iterare sulle tuple. Sapendo che un utente ha da 0 a N email, a mano creo una struttura tipo:<br></div><span style="font-family:courier new,monospace">{<br>  'id': 1,<br>  'name': 'alberto',<br>  'emails': [{<br>    'id': 1,<br>    '<a href="mailto:alberto@example.org" target="_blank">alberto@example.org</a>'<br>  }, {<br>    'id': 2,<br>    '<a href="mailto:alberto@lemonparty.org" target="_blank">alberto@lemonparty.org</a>' }<br>  ]<br>}</span><br><br></div>Onestamente, fare a mano questa operazione mi sembra abbastanza idiota e macchinoso. Tempo fa avevo fatto un iteratore che iterava su dati di tipo tabella e automaticamente raggruppava quello che era possibile raggruppare (per ragioni di semplicità l'iteratore si aspetta dati ordinati). Mi chiedo, rispolvero l'iteratore che mi ero fatto o ci sono modi più eleganti e intelligenti per farlo? Insisto sul fatto che non ho molta voglia di usare un ORM.<br><br></div><div>Best practices? Idee?<br></div><div><br></div>Grazie,<br>Alberto<br></div>