我有一个带有 JSONB 列的简单表。在该字段中,我有一个 key:key的值key可以是带有["val1", "val2"]或单个 string的列表"val2"。
我得到了一个原始 SQL 查询,该查询在中的值key是"val2":
SELECT t.c FROM t WHERE t.c->'key' ? "val2"
Run Code Online (Sandbox Code Playgroud)
但是,我正在努力在 SQLAlchemy 查询中复制它:
我有一个 session
query = session.query(t).filter(t.c.has_key('val2'))
Run Code Online (Sandbox Code Playgroud)
这导致
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'
Run Code Online (Sandbox Code Playgroud)
有什么想法吗?
旧版本的 SQLAlchemyJSONB列JSONElement在项目访问时生成对象,这些对象似乎缺少某些 json 比较器方法,例如has_key(). 该JSONB类型是在 1.0 版中引入的,然后向后移植到 0.9.7,但我认为这已在 1.1 中修复。同时,如果您无法升级 SQLAlchemy,您可以使用通用op()运算符函数解决此问题:
query = session.query(t).\
filter(t.c['key2'].op('?')('val2'))
Run Code Online (Sandbox Code Playgroud)
当你最终成功升级时,你可以
filter(t.c['key2'].has_key('val2'))
Run Code Online (Sandbox Code Playgroud)
正如预期的那样。
| 归档时间: |
|
| 查看次数: |
2576 次 |
| 最近记录: |