SQLAlchemy:过滤存储在JSONB字段的嵌套列表中的值

时间:2016-09-12 23:58:43

标签: python json postgresql sqlalchemy

假设我有一个名为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过滤器实现此目的?

1 个答案:

答案 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字符串。