sqlalchemy,筛选包含数组的json列

Ste*_*veL 5 python sqlalchemy

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

{
    "telephones":[
        {"telephone":54435345,"type":"landline"},
        {"telephone":694823747,"type":"mobile"},
    ]
}
Run Code Online (Sandbox Code Playgroud)

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

Table.contact_info["telephones"][0]["telephone"].astext.ilike(mask)
Run Code Online (Sandbox Code Playgroud)

但这仅搜索0th元素。

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

Table._contact_info["telephones"].astext.ilike(mask)
Run Code Online (Sandbox Code Playgroud)

ser*_*inc 4

在带有 JSONB 的 PostgreSQL 中,您可以使用包含检查:

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

在 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()
Run Code Online (Sandbox Code Playgroud)

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