【问题标题】:sqlalchemy, filter a json column containing an array [duplicate]sqlalchemy,过滤包含数组的json列[重复]
【发布时间】:2017-10-28 10:44:18
【问题描述】:

我有一个带有json列“contact_info”的表,该列的结构通常是这样的:

{
    "telephones":[
        {"telephone":54435345,"type":"landline"},
        {"telephone":694823747,"type":"mobile"},
    ]
}

我想查找具有特定电话的所有行, 我在 sqlalchemy 的 json 数组周围发现的唯一东西是这样的:

Table.contact_info["telephones"][0]["telephone"].astext.ilike(mask)

但这只会搜索0th 元素。

目前我愚蠢的解决方案是将“电话”转换为文本并执行ilike,但这当然是错误的......

Table._contact_info["telephones"].astext.ilike(mask)

【问题讨论】:

  • 理解你的感受,但据我所知你的解决方案很好:)你可以使用 .like ,但应该更快。
  • 你试过func.json_contains吗?
  • 哪个数据库?

标签: python postgresql sqlalchemy


【解决方案1】:

In PostgreSQL with JSONB你可以使用遏制检查:

dict = {"telephones": [{"telephone": "54435345"}]}
user = cls.query.filter(your_table.contact_info.contains(dict)).first()

In MySQL 或许可以使用func.json_contains:

from sqlalchemy import func

# JSON_CONTAINS returns 0 or 1, not found or found. Not sure if MySQL
# likes integer values in WHERE, added == 1 just to be safe
session.query(Story).filter(func.json_contains(Story.section_ids, X) == 1).all()

(你需要适应并尝试一下,当然是 MySQL 的方式,但也可能是 PostgreSQL 的方式)

【讨论】:

  • postgreSQL 方式似乎不太好,如果我在电话里有更多信息怎么办?比如 "telephones": {"telephone": "54435345","contact_hours":"9-5"},它不会匹配。 MongoDB 和 MySQL 只是一个 nogo,因为整个项目都在 postgres 中。
  • @SteveL:很抱歉无法为您提供进一步帮助。如果您希望我在这个问题上提供赏金,请这样说:-)
  • @SteveL Oldies goldies,但是:额外的键不会影响 containment 检查(不完全匹配/相等),它的名称表示检查给定的 JSON 路径是否/value 包含在左侧的jsonb 中。另外由于"telephones" 包含一个列表,JSON 路径/值也应该包含该列表,如{"telephones": [{"telephone": "54435345"}]}
猜你喜欢
  • 2020-05-15
  • 1970-01-01
  • 2021-08-28
  • 2022-08-04
  • 2018-02-25
  • 1970-01-01
  • 2016-09-23
  • 2019-06-16
  • 2021-08-07
相关资源
最近更新 更多