[Python] Postgresql json columns was: Psycopg2 e serializzazione delle SELECT in JSON
Daniele Varrazzo
piro a develer.com
Gio 16 Ott 2014 18:29:20 CEST
On 2014-10-16 17:16, Daniele Varrazzo wrote:
> On 2014-10-16 16:38, Carlos Catucci wrote:
>> Approfitto del thread su psycopg2 per formulare una domnada dborder
>> line
>> all'OT.
>>
>> Sto cercando ddi usre delle colonne JSON con Postgres 9.3/Django 1.6+.
>> Ovvio che devo usare (*) delle rwa query. Solo che fatico a ottenere
>> un
>> risultato con una struttura di questo tipo:
>>
>> data = '{ "A": { "B": [ { "C": 1, "D": 2 }, { "C": 3, "D": 4 }, {
>> "C":1,
>> "D": 6, "E": 3 } ] } }'
>>
>> per fare una query dove mi deve tornare tutti i record, per dire che
>> abbianno
>>
>> tabella.data->'A'->'B'->'C' == 1
> Non ci ho ancora giocato troppo con le funzioni json di postgres.
> Guardando i doc, json_populate_recordset sembra promettente: ...
Anche json_array_element puo' funzionare: srotola una lista json negli
oggetti che contiene:
piro=# select id, json_array_elements(data-> 'A' -> 'B') from
mydata; id
| json_array_elements
----+----------------------------
1 | { "C": 1, "D": 2 }
1 | { "C": 3, "D": 4 }
1 | { "C":1, "D": 6, "E": 3 }
2 | { "C": 0, "D": 2 }
2 | { "C": 3, "D": 4 }
2 | { "C": 0, "D": 6, "E": 3 }
(6 rows)
quindi puoi filtrare gli elementi che hannno C = 1
piro=# select id from (select id, json_array_elements(data-> 'A' ->
'B') as data from mydata) x where (data -> 'C')::text = '1';
id
----
1
1
(2 rows)
e di nuovo puoi usare exists per prendere i record che ti servono:
piro=# select d.* from mydata d
where exists (
select 1 from (
select id, json_array_elements(data-> 'A' -> 'B') as data
from mydata) x
where (data -> 'C')::text = '1'
and x.id = d.id);
id | data
----+---------------------------------------------------------------------------
1 | { "A": { "B": [ { "C": 1, "D": 2 }, { "C": 3, "D": 4 }, {
"C":1, "D": 6, .
|."E": 3 } ] } }
(1 row)
Questo penso sia meglio perche' non richiede un CREATE TYPE.
-- Daniele
Maggiori informazioni sulla lista
Python