Python 炼金术?JSONB键上的运算符
我有一个带有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'但我想要?操作员在->上 获取->(据我所知)的唯
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'))