如何在 sqlalchemy 的 ORM 中使用 postgresql 的 jsonb_each 函数

内森·哈扎德

我正在尝试编写一个函数来通过 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 语句中时,我已经竭尽全力试图欺骗它。

伊利亚·埃维莱拉

对于返回标量或单列集的函数,您只需使用func.something.alias('x')and column('x')不幸的是,SQLAlchemy 不支持显式地为列设置别名,因此处理返回多列组合的函数有点棘手。如果jsonb_each 默认名称是keyandvalue,那么您可以使用这些:

v = column('value', type_=JSONB)
score = v['score'].astext.cast(Float)

session.query(Statistics,
              func.avg(score).label('average_score')).\
    select_from(Statistics,
                func.jsonb_each(Statistics.scores).alias()).\
    filter(func.jsonb_typeof(Statistics.scores) != 'null').\
    group_by(Statistics.id)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用jsonb_each将Postgresql查询转换为sqlalchemy

Postgresql jsonb_each 函数在与 group by 聚合函数一起使用时忽略空列数据

如何在 postgresql 中使用 age() 函数

在 SqlAlchemy 中如何在不同的表 ORM 之间共享函数

在Django ORM中使用postgresql窗口函数的干净方法?

如何在python中使用sqlalchemy调用mysql函数?

如何在Flask SQLAlchemy中使用SUM聚合函数?

何时以及如何在PostgreSQL中使用窗口函数?

如何在Postgresql函数中使用变量进行循环查询

如何在PostgreSQL函数中使用COMMIT和ROLLBACK

如何在PostgreSQL中使用函数插入多行

如何在 EFCore 中使用 postgresql 反向函数

我应该如何在 PostgreSQL 中使用 COALESCE 函数?

如何使用sqlalchemy orm实现子选择?

如何在PostgreSQL中使用父项更新JSONB对象

如何在postgresql中使用jsonb的键作为行值?

jsonb_each函数返回空值Not Castable To null :: INT

如何在sqlalchemy混合函数中使用postgres方言计算最大值

如何在Flask中使用SQLAlchemy调用数据库函数?

如何在postgresql上使用sqlalchemy做适当的upsert?

如何在Django ORM中使用GROUP BY

如何使用ORM使用SqlAlchemy从多值字段获取对象列表?

如何使用CASCADE指令以ORM方式使用SqlAlchemy清除PostgresDB

如何在PostgreSQL中使用peewee orm为flask应用程序创建表而没有双引号

如何在 jQuery 类的 each 函数中使用“this”访问类?

如何在.each(function)遍历中使用已经定义的函数

如何在 jQuery .each() 函数中使用“class”而不是“ID”?

如何在不使用ORM的情况下使用SQLAlchemy查询从表中删除行?

如何在不使用ORM的情况下使用SQLAlchemy查询从表中删除行?