Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 炼金术?JSONB键上的运算符_Python_Sqlalchemy - Fatal编程技术网

Python 炼金术?JSONB键上的运算符

Python 炼金术?JSONB键上的运算符,python,sqlalchemy,Python,Sqlalchemy,我有一个带有JSONB列的简单表。在该字段中,我有一个键:key,键的值可以是一个带有[“val1”,“val2”]的列表,也可以是一个字符串“val2” 我得到了一个原始SQL查询,当键中的值是的“val2”时进行检索: 但是,我很难在SQLAlchemy查询中复制这一点: 我有一个会话 query = session.query(t).filter(t.c.has_key('val2')) 导致 从t中选择t.c.,其中t.c?'val2'但我想要?操作员在->上 获取->(据我所知)的唯

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

我得到了一个原始SQL查询,当
键中的值是
的“val2”
时进行检索:

但是,我很难在SQLAlchemy查询中复制这一点:

我有一个
会话

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

从t中选择t.c.,其中t.c?'val2'
但我想要
操作员在
->

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

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

有什么想法吗?

SQLAlchemy的
JSONB
列的旧版本在item访问上生成
jsonement
对象,这些对象似乎缺少某些json比较方法,例如
has_key()
JSONB
类型是在1.0版中引入的,并向后移植到0.9.7版,但我认为。同时,如果您无法升级SQLAlchemy,您可以使用以下方法解决此问题:

当你最终成功升级时,你可以

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

正如所料。

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

当你最终成功升级时,你可以

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

正如预期的那样。

虽然可能不是最优的,但您可以使用
过滤器(t.c['key2'].op('?')('val2'))
解决这个问题,或者更新您的SQLAlchemy。在这种情况下,较新的版本可以正常工作。或者:
filter(t.c['key'].has_key('val2'))
@IljaEveriläNice one,请将其添加为答案,我会接受它。谢谢。虽然可能不是最优的,但是您可以使用
过滤器(t.c['key2'].op('?')('val2'))
解决这个问题,或者更新您的SQLAlchemy。在这种情况下,较新的版本可以正常工作。或者:
filter(t.c['key'].has_key('val2'))
@IljaEveriläNice one,请将其添加为答案,我会接受它。谢谢。很好的位置更新,正在使用1.0.17。但是知道
.op()
很好。好的地方是使用1.0.17。但是了解
.op()
是件好事。
filter(t.c['key2'].has_key('val2'))