如何使用SQLAlchemy查询Jsonb数组

3

我有一些存储在jsonb字段中的数据,其格式如下:

class Test(Base):
    __tablename__ = 'test'
    id = Column(Integer, primary_key=True)
    data = Column(JSONB)

在“data”列中,有一个形式为json的数据:
{depth: [0.0, 0.01, 0.02, 0.03, 0.04, 0.05, 0.06]}

我想确定每个记录的最大深度,并提出了以下的原始SQL查询,它可以完成这项任务:

SELECT test.id, test.name,
  (SELECT max(elem::float)
   FROM jsonb_array_elements_text(test.data -> 'depth') As elem
   ) AS maxdepth
FROM test
ORDER BY maxdepth DESC

由于我在我的应用程序中使用SQLAlchemy ORM,因此我希望使用SQLAlchemy ORM编写此查询,但我无法找到正确的形式。

我认为我需要像这样的东西:

subq = session.query(
    func.max().label('maxdepth')).\
    select_from(func.jsonb_array_elements(Test.data['depth'])).\
    subquery()

stmnt = session.query(
    Test.id, subq.c.maxdepth).\
    order_by(subq.c.maxdepth)

但是这显然行不通,因为我不知道如何从jsonb_array_elements提取的字段中进行查询。

1个回答

2

[注意:截至SQLAlchemy 1.0,2015年10月26日。这可能会在未来的版本中更改] 目前SQLAlchemy没有内置这些特殊的PG语法,请参考此处的示例来编写您的查询。


谢谢你的帮助,我可以确认这个有效。我希望你能在未来的版本中找到改进内置的SQLAlchemy PG/JSON支持的方法! - Thijs D
我希望有一份当前的文档,包含这个支持文档。截至2019年8月8日,SQLAlchemy和JSONB的文档相当难以找到。 - Michael Draper
1
我看不到这个页面。仓库现在是私有的吗? - bluesmonk
代码库已经迁移到Github,现在在这里:https://github.com/sqlalchemy/sqlalchemy/issues/3566#issuecomment-441931331。我不确定要链接哪个具体的评论,但是线程中的一个应该就是预期的。 - KyleKing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接