SQLAlchemy ?JSONB 密钥上的运算符



我有一个简单的带有JSONB列的表格。在该字段中,我有一个键:keykey的值可以是具有["val1", "val2"]的列表,也可以是单个字符串"val2"

我得到了一个原始SQL查询,当key中的值"val2"时检索:

SELECT t.c FROM t WHERE t.c->'key' ? "val2"

但是,我正在努力在SQLAlchemy查询中复制它:

我有session

query = session.query(t).filter(t.c.has_key('val2'))

这导致

SELECT t.c FROM t WHERE t.c ? 'val2'但我希望?操作员在->.

获得->的唯一方法(据我所知(是使用 filter(t.c['key2']) .但是,我无法执行has_key()我得到:

AttributeError: Neither 'JSONElement' object nor 'Comparator' object has an attribute 'has_key'

有什么想法吗?

旧版本的 SQLAlchemy 的JSONB列在项目访问时生成JSONElement对象,这些对象似乎缺少某些 json 比较器方法,例如 has_key()JSONB 类型是在 1.0 版中引入的,并向后移植到 0.9.7,但我认为这在 1.1 中得到了修复。同时,如果无法升级 SQLAlchemy,则可以使用泛型op()运算符函数解决此问题:

query = session.query(t).
    filter(t.c['key2'].op('?')('val2'))

当你终于设法升级时,你可以

filter(t.c['key2'].has_key('val2'))

不出所料。

最新更新