繁体   English   中英

使用 jsonb_each 将 Postgresql 查询转换为 sqlalchemy

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM