![](/img/trans.png)
[英]Postgresql SQLalchemy filter query for list of jsonb strings
[英]Convert Postgresql query with jsonb_each to sqlalchemy
我有一个查询,它有两个jsonb_each
语句,我需要将它转换为 sqlalchemy。 我曾尝试使用子查询、别名甚至op
fn 来逐字翻译查询,但它因InternalError
而失败。
我特别坚持的是我不知道如何访问从第一个jsonb_each
函数返回的{key: value}
对。
这是我迄今为止所拥有的
v = column('value', type_=JSONB)
k = column('key', type_=JSONB)
polarity = v['polarity'].astext
q = db.session.query(
db.func.count(polarity).label('count'),
## other fields
)\
.select_from(MyModel)\
.join(db.func.jsonb_each(MyModel.json_content['myMap']).alias('items'), sa.true())\
.join(
# ... stuck here
# I want to access the returned data from the previous join here
)\
# group by and order by here
.all()
查询
-- myTable
-- - id
-- - json_content
SELECT
count(d.value ->> 'polarity') as count,
d.value ->> 'polarity' as polarity,
d.key as key
from myTable t
join jsonb_each(t.json_content -> 'myMap') m on true
join jsonb_each((m.value -> 'data') - 'text') d on true
group by d.value ->> 'polarity', d.key;
我想得到的结果集
count polarity category
----------------------------
1 positive cate2
1 positive cate4
2 negative cate1
1 negative cate2
我试图查询的示例 json 对象
{
"myMap": {
"0": {
"data": {
"text": "koolaid",
"cate1": {
"polarity": "negative"
},
"cate2": {
"polarity": "positive"
}
}
},
"1": {
"data": {
"text": "some other text",
"cate1": {
"polarity": "negative"
},
"cate2": {
"polarity": "negative"
},
"cate4": {
"polarity": "positive"
}
}
}
}
}
如果需要更多信息,请告诉我
您可以将aliased
与此处定义的配方和此处说明的查询结合使用,而不是使用column
所以代码将是这样的:
first_alias = aliased(jsonb_each(MyModel.json_content['myMap'])))
second_alias = aliased(jsonb_each(first_alias.c.value.op("->")("data").op("-")("text")))
polarity = second_alias.c.value.op('->>')('polarity')
q = db.session.query(
db.func.count(polarity).label('count'),
## other fields
)\
.select_from(MyModel)\
.join(first_alias, sa.true())\
.join(second_alias, sa.true())\
# group by and order by here
.all()
jsonb_each
函数不是从 Sqlalchemy 函数导入的。 它是按照此处指定的定制制作的
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.