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

2024-05-15 06:00:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSONB列thal看起来像这样的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'

我试着用数组打字,但运气不好。任何有关这方面的帮助将不胜感激


Tags: idjsonurlmap列表字典sessionorm

热门问题