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

4

我正在努力将这个转换为ORM过滤查询:

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

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

我不确定如何使用问号运算符来构建筛选器。

我相信Postgres ARRAY应该像这样工作:

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

但是我正在使用JSONB,过滤器语法不同。你有什么建议吗?
3个回答

4
你可以使用 .op() 方法来使用任何原始运算符:
query.filter(pending_notifications.op("?")("flooby"))

3

如果您使用JSONB作为列数据类型,请使用has_key()方法:

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

这将映射到?运算符。在这种情况下,该方法名称有误导作用,但是PostgreSQL jsonb操作符的文档如此描述?:

字符串是否存在于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

0

我可以在过滤器中使用原始 SQL

from sqlalchemy import text

db.session.query(Issue).filter(text("pending_notifications ? 'flooby'")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接