PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

SQLAlchemy:Filtern nach Werten, die in der verschachtelten Liste des JSONB-Felds gespeichert sind

JSONB von SQLAlchemy type hat den contains() Methode für @> Operator in Postgresql. Der @> -Operator wird verwendet, um zu prüfen, ob der linke Wert die richtigen JSON-Pfad/Wert-Einträge auf der obersten Ebene enthält. In Ihrem Fall

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

Oder in Python

the_value = 'one'

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

Die Methode konvertiert Ihre Python-Struktur in einen geeigneten JSON-String für die Datenbank.

In Postgresql 12 können Sie die JSON-Pfadfunktionen verwenden:

import json

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