SQLAlchemy? JSONB键上的运算符

时间:2017-05-16 18:04:50

标签: python sqlalchemy

我有一个带有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'

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

旧版本的SQLAlchemy JSONB列在项目访问时生成JSONElement个对象,这些对象似乎缺少某些json比较器方法,例如has_key()。版本1.0中引入了JSONB类型,并向后移植到0.9.7,但我认为this was fixed in 1.1。同时,如果您无法升级SQLAlchemy,可以使用generic op() operator function解决此问题:

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

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

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

正如所料。