我正在努力将其转换为ORM过滤器查询:
select count(*) from issues WHERE pending_notifications ? 'flooby';
pending_notifications是一个包含简单JSON数组的JSONB字段。
我不确定如何使用问号运算符
构建过滤器我相信Postgres ARRAY会像这样工作:
query.filter(pending_notifications.any('flooby'))
但我使用的是JSONB,过滤器语法也不一样。
任何建议
答案 0 :(得分:3)
您可以使用.op()
方法使用任何逐字运算符:
query.filter(pending_notifications.op("?")("flooby"))
答案 1 :(得分:2)
鉴于您使用JSONB
作为列数据类型,请使用has_key()
方法:
query.filter(pending_notifications.has_key('flooby'))
映射到?
运算符。方法名称在此上下文中具有误导性,但Postgresql documentation for jsonb operators因此描述了?
:
字符串是否作为JSON值中的顶级键存在?
所以has_key()
有点恰如其分。
一个例子:
In [21]: t = Table('t', metadata, Column('json', postgresql.JSONB))
In [28]: print(t.c.json.has_key('test'))
t.json ? :json_1
答案 2 :(得分:0)
我可以在过滤器中使用原始sql
from sqlalchemy import text
db.session.query(Issue).filter(text("pending_notifications ? 'flooby'")