【发布时间】:2019-01-22 15:29:11
【问题描述】:
我正在尝试编写一个函数来通过 sqlalchemy 计算 postgres 中嵌套 json 值的平均值。我要平均的值在统计表中,其中包含一个包含这样的 json 字典的分数列(过滤到相关结构): {1: {'score': 0.0}, 2: {'score' : 0.0} ...}。
用postgres编写,查询如下:
SELECT *, avg((v->>'score')::float) AS average_score
FROM lms.statistics, jsonb_each(statistics.scores) js(k, v)
WHERE jsonb_typeof(scores) != 'null'
GROUP BY statistics.id
我主要将其转换为以下 sqlalchemy 代码:
(
session.query(Statistics)
.add_columns(literal_column("avg((v->>'score')::float)").label('average_score'))
.filter(literal("jsonb_typeof(statistics.scores != 'null'"))
.group_by(Statistics.id)
).all()
但是,无论我尝试做什么,sqlalchemy 都不允许我包含此查询所依赖的 jsonb_each。我什至尝试重组查询以使用显式连接,而 sqlalchemy 的 .join 不会接受literal_column、文本或任何带有外部连接或指定假连接条件的诡计。当必须有一个 sqlalchemy 标准来将纯文本查询插入 FROM 或 JOIN 语句时,我已经走到尽头了。
【问题讨论】:
标签: postgresql sqlalchemy