我有一个简单的带有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'
有什么想法吗?
旧版本的 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'))
不出所料。