2017-05-05 50 views
1

随着SQLAlchemy的我想从一个子查询sq_objects重现可用aggregate function jsonb_object_agg:JSONB SQLAlchemy的聚合函数

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) 

然而,execute返回:

(psycopg2.ProgrammingError)无法适应type'method'

[ 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 

回答

1

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

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