【问题标题】:JSONB sqlalchemy Aggregate FunctionJSONB sqlalchemy 聚合函数
【发布时间】:2017-05-05 09:54:44
【问题描述】:

使用 SQLAlchemy,我想从子查询 sq_objects 重现可用的 aggregate function jsonb_object_agg:

from sqlalchemy import select, func
s = select([
    sq_objects.c.object_id,
    func.jsonb_object_agg(
        sq_objects.c.keys, sq_objects.c.values).over(
        partition_by=sq_objects.c.object_id).label("attributes"),
]).\
    distinct(sq_objects.c.object_id)

但是,执行返回:

(psycopg2.ProgrammingError) 无法适应类型“方法”

[ SQL: "SELECT DISTINCT ON (sq_objects.object_id)
     sq_objects.object_id,
     jsonb_object_agg(
         %(jsonb_object_agg_1)s,
         %(jsonb_object_agg_2)s
     ) OVER (PARTITION BY sq_objects.object_id) AS attributes
 FROM (SELECT ... ) AS sq_objects"
] [
parameters: {'jsonb_object_agg_1': <bound method Properties.keys of <sqlalchemy.sql.base.ImmutableColumnCollection object at 0x7f0ffb7aa828>>,
             'jsonb_object_agg_2': <bound method Properties.values of <sqlalchemy.sql.base.ImmutableColumnCollection object at 0x7f0ffb7aa828>>}]

这是我要复现的sql代码:

SELECT DISTINCT ON (sq_objects.object_id)
    sq_objects.object_id,
    jsonb_object_agg(
        sq_objects.keys,
        sq_objects.values
    ) OVER (PARTITION BY sq_objects.object_id) AS attributes
FROM (SELECT ... ) AS sq_objects

【问题讨论】:

    标签: postgresql sqlalchemy


    【解决方案1】:

    问题在于属性keysvalues 是不可变列集合sq_objects.c 的方法。该问题的另一个解决方案是使用项目访问表示法来获取实际列:

    func.jsonb_object_agg(
        sq_objects.c["keys"],
        sq_objects.c["values"]
    ).over(
        partition_by=sq_objects.c.object_id
    ).label("attributes")
    

    【讨论】:

      【解决方案2】:

      不是最优雅的实现,但因为我现在是子查询列的标签;一个原始的text 输入解决了这个问题:

      func.jsonb_object_agg(
          text("sq_objects.keys"),
          text("sq_objects.values")
      ).over(
          partition_by=sq_objects.c.object_id).label("attributes"),
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-31
        • 2021-11-03
        • 1970-01-01
        • 1970-01-01
        • 2019-06-11
        • 1970-01-01
        • 2019-12-31
        相关资源
        最近更新 更多