假设我有一个名为Item
的模型,其中包含一个JSONB字段data
。其中一条记录存储了以下JSON对象:
{
"name": "hello",
"nested_object": {
"nested_name": "nested"
},
"nested_list": [
{
"nested_key": "one"
},
{
"nested_key": "two"
}
]
}
我可以通过在name
字段上过滤来找到此记录:
Session().query(Item).filter(Item.data["name"] == "hello")
我可以通过同样过滤嵌套对象来找到此记录:
Session().query(Item).filter(Item.data[("nested_object","nested_name")] == "hello")
但是,我正在努力通过过滤嵌套列表中存储的项的值来找到找到此记录的方法。
换句话说,如果用户提供了值“one”,我想找到上面的记录,我知道要在nested_key
中的密钥nested_list
中查找。
是否可以使用SQLAlchemy过滤器实现此目的?
答案 0 :(得分:3)
SQLAlchemy的JSONB
类型在Postgresql中为@>
运算符提供了contains()
方法。 The @>
operator用于检查左侧值是否包含顶级的正确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字符串。