我有一个带有JSONB列的简单表。在该字段中,我有一个密钥:key
,key
的值可以是包含["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'
有什么想法吗?
答案 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'))
正如所料。