PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

SQLAlchemy :filtrage sur les valeurs stockées dans la liste imbriquée du champ JSONB

JSONB de SQLAlchemy le type a le contains() méthode pour le @> opérateur dans Postgresql. Le @> L'opérateur est utilisé pour vérifier si la valeur de gauche contient les bonnes entrées de chemin/valeur JSON au niveau supérieur. Dans votre cas

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

Ou en python

the_value = 'one'

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

La méthode convertit votre structure python en chaîne JSON appropriée pour la base de données.

Dans Postgresql 12, vous pouvez utiliser les fonctions de chemin JSON :

import json

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