[Python] Psycopg2 e serializzazione delle SELECT in JSON

Alberto Granzotto agranzot a gmail.com
Gio 16 Ott 2014 14:59:52 CEST


Ciao a tutt*,
sto giocando un po' con Flask e Psycopg2.

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).

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.
Sto usando RealDictCursor
<http://initd.org/psycopg/docs/extras.html#real-dictionary-cursor> 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.

Esempio micro:
test=> create table users (id serial primary key, name text);
test=> create table emails (id serial primary key, user_id integer
references users, email text);
test=> insert into users (name) values ('alberto');
test=> insert into emails (user_id, email) values (1, 'alberto a example.org
');
test=> insert into emails (user_id, email) values (1, '
alberto a lemonparty.org');
test=> select * from users inner join emails on (users.id = emails.user_id);

 id |  name   | id | user_id |         email
----+---------+----+---------+------------------------
  1 | alberto |  1 |       1 | alberto a example.org
  1 | alberto |  2 |       1 | alberto a lemonparty.org

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:
{
  'id': 1,
  'name': 'alberto',
  'emails': [{
    'id': 1,
    'alberto a example.org'
  }, {
    'id': 2,
    'alberto a lemonparty.org' }
  ]
}

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.

Best practices? Idee?

Grazie,
Alberto
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20141016/47de368a/attachment.html>


Maggiori informazioni sulla lista Python