PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

SQLAlchemy:filtraggio sui valori memorizzati nell'elenco nidificato del campo JSONB

JSONB di SQLAlchemy tipo ha il contains() metodo per il @> operatore in Postgresql. Il @> viene utilizzato per verificare se il valore di sinistra contiene le voci di percorso/valore JSON di destra al livello superiore. Nel tuo caso

data @> '{"nested_list": [{"nested_key": "one"}]}'::jsonb

O in Python

the_value = 'one'

Session().query(Item).filter(Item.data.contains(
    {'nested_list': [{'nested_key': the_value}]}
))

Il metodo converte la tua struttura Python in una stringa JSON adatta per il database.

In Postgresql 12 puoi usare le funzioni del percorso JSON:

import json

Session().query(Item).\
    filter(func.jsonb_path_exists(
        Item.data,
        '$.nested_list[*].nested_key ? (@ == $val)',
        json.dumps({"val": the_value})))