SqlAlchemy:查询包含字典列表的JSONB列,以获取要与预定义列表进行比较的公共密钥列表

时间:2019-10-23 16:20:51

标签: python postgresql sqlalchemy

我有一个JSONB列,看起来像这样url_map

[
    {"id": "id_1", "url": "url_1"},
    {"id": "id_2", "url": "url_2"},
    {"id": "id_3", "url": "url_3"},
    {"id": "id_4", "url": "url_4"},
]

请注意,这是一个JSONB列,它是词典列表。

当我尝试为此数据输入新条目时,我有一组ID列在列表中:

['id_1', 'id_2', 'id_3', 'id_4']

我需要对此表运行一个ORM会话查询,该查询将告诉我是否存在任何包含列url_map的记录,这些记录包含具有传入列表中所有ID的字典。

我已经找到了一个足够简单的直接SQL查询,可以为我执行此操作:

select id
from mapper
where ARRAY(SELECT json_array_elements(url_mp::json)->>'id')
    = ARRAY['id_1', 'id_2', 'id_4', 'id_4'];

这将返回一行(如果存在一个行)或不返回任何行。

我的噩梦一直是将其转换为ORM代码。

这是我到目前为止使用ORM提出的内容:

new_ids = ['id_1', 'id_2', 'id_4', 'id_4']
with session_() as session:
    sub_query = session.query(
        func.json_array_elements(mapper.url_map.op('->>')('id')).label('id')
    ).subquery()

    result = session.query(mapper.id).filter(
        sub_query.c.csku == new_ids
    ).all()

我期望它返回该行的ID,但是result返回一个空列表,尽管数据库中存在有效的条目。

我可以得到的原始查询

str(query.statement.compile(dialect=postgresql.dialect()))

只是说

'SELECT mapper.id \nFROM mapper \nWHERE false'

我尝试使用ARRAY进行类型转换,但没有遇到任何失败。任何对此的帮助将不胜感激!

0 个答案:

没有答案