sqlalchemy,过滤包含数组的json列

时间:2017-05-27 18:15:18

标签: sqlalchemy

我有一个带有json列的表" contact_info",此列的结构通常是这样的:

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

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

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

但是这只搜索0元素。

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

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

1 个答案:

答案 0 :(得分:0)

这似乎取决于数据库。请尝试以下其中一项

In MongoDB(是的,它不是sql,但对于JSON来说,它简单直观)

db.contact_info.find({"telephones.telephone": {"$in": [54435345]}})

In PostgreSQL with JSONB可能类似

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

In MySQL可以使用funcjson_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)