sql >> Base de Datos >  >> RDS >> PostgreSQL

SQLAlchemy:filtrado de valores almacenados en la lista anidada del campo JSONB

JSONB de SQLAlchemy tipo tiene el contains() método para el @> operador en Postgresql. El @> El operador se utiliza para comprobar si el valor de la izquierda contiene las entradas de valor/ruta JSON correctas en el nivel superior. En tu caso

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

O en python

the_value = 'one'

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

El método convierte su estructura de python en una cadena JSON adecuada para la base de datos.

En Postgresql 12 puede usar las funciones de ruta JSON:

import json

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