SQLAlchemyのJSONB
タイプにはcontains()
があります @>
のメソッド Postgresqlの演算子。 @>
演算子は、左側の値に最上位の右側のJSONパス/値エントリが含まれているかどうかを確認するために使用されます。あなたの場合
data @> '{"nested_list": [{"nested_key": "one"}]}'::jsonb
またはPythonで
the_value = 'one'
Session().query(Item).filter(Item.data.contains(
{'nested_list': [{'nested_key': the_value}]}
))
このメソッドは、Python構造をデータベースに適したJSON文字列に変換します。
Postgresql 12では、JSONパス関数を使用できます:
import json
Session().query(Item).\
filter(func.jsonb_path_exists(
Item.data,
'$.nested_list[*].nested_key ? (@ == $val)',
json.dumps({"val": the_value})))