PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

SQLAlchemy:filtrando os valores armazenados na lista aninhada do campo JSONB


JSONB do SQLAlchemy tipo tem o contains() método para o @> operador no Postgresql. O @> O operador é usado para verificar se o valor à esquerda contém as entradas de caminho/valor JSON à direita no nível superior. No seu caso
data @> '{"nested_list": [{"nested_key": "one"}]}'::jsonb

Ou em python
the_value = 'one'

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

O método converte sua estrutura python em uma string JSON adequada para o banco de dados.

No Postgresql 12 você pode usar as funções de caminho JSON:
import json

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