【问题标题】:SQLAlchemy: retrieve records by exact matching on keys in nested JSONB fieldSQLAlchemy:通过精确匹配嵌套 JSONB 字段中的键来检索记录
【发布时间】:2021-02-19 05:25:46
【问题描述】:

假设我有一个名为Table 的表,其中包含一个JSONB 字段data。其中一条记录(记录 1)存储有以下 JSON 对象:

{
    "A": {},
    "B": {}
}

另一条记录(记录 2)存储了以下 JSONB 对象:

{
    "A": {},
    "B": {},
    "C": {}
}

我正在努力定义一种通过对data 字段中的键进行精确过滤来查找记录的方法。例如,我想在data字段中检索只有键“A”“B”的记录,即记录1。

我已经尝试过 SQLAlchemy 的 JSONB 类型比较器 methods,例如 contains() 方法,但是在以下 Python 查询的情况下这将返回两条记录:

Session().query(Table).filter(Table.data.contains({"A": {}, "B": {}})).all()

是否可以使用可用的 SQLAlchemy 过滤器对(列表)键进行精确过滤?欢迎任何想法。非常感谢!

【问题讨论】:

  • 这能回答你的问题吗? Flask SQLAlchemy query, specify column names
  • @sahasrara62 它们是不同的问题,所以很遗憾它没有回答我的问题。我正在寻找一种方法来检查 JSONB 字段中的键是否与键列表完全匹配。
  • 所以你试图从存储在数据库中的数据对象(这里是 json )中过滤掉数据?我不认为你可以直接这样做,你需要先获取所有然后遍历它们并应用条件
  • 不完全从数据对象 (jsonb) 中过滤掉数据,而是根据数据对象中的键过滤记录。所以基本上我正在寻找类似以下过滤功能的东西:filter(Table.data.keys() == ['A', 'B'])。这不起作用,因为 JSONB 对象数据没有函数keys()

标签: python json postgresql sqlalchemy jsonb


【解决方案1】:

如果字符串作为顶级键存在,? 运算符返回 true。

- 运算符从左操作数中删除键/值对。

你可以这样组合:

select data from Table 
where data ? 'A' and data ? 'B' and (data - 'A') - 'B' = '{}';

用英语,获取记录

  • 包含“A”和“B”键:data ? 'A' and data ? 'B'
  • 如果您删除“A”和“B”键(即不包含其他键)则为空:(data - 'A') - 'B' = '{}'

【讨论】:

    猜你喜欢
    • 2015-03-28
    • 2017-01-20
    • 2016-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多