我有一个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进行类型转换,但没有遇到任何失败。任何对此的帮助将不胜感激!