SqlAlchemy Postgres JSON如何用问号运算符过滤?

时间:2016-08-28 23:07:01

标签: python postgresql sqlalchemy

我正在努力将其转换为ORM过滤器查询:

select count(*) from issues WHERE pending_notifications ? 'flooby';

pending_notifications是一个包含简单JSON数组的JSONB字段。

我不确定如何使用问号运算符

构建过滤器

我相信Postgres ARRAY会像这样工作:

query.filter(pending_notifications.any('flooby'))

但我使用的是JSONB,过滤器语法也不一样。

任何建议

3 个答案:

答案 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'")