[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