[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