如何使用 sqlalchemy 查询 jsonb 数组

Posted

技术标签:

【中文标题】如何使用 sqlalchemy 查询 jsonb 数组【英文标题】:How to query jsonb array with sqlalchemy 【发布时间】:2015-10-19 12:38:18 【问题描述】:

我将数据存储在 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】:

[注意:自 SQLAlchemy 1.0 起,2015 年 10 月 26 日。这可能会在未来的版本中更改] 这些特殊的 PG 语法目前尚未内置到 SQLAlchemy 中,请参阅https://bitbucket.org/zzzeek/sqlalchemy/issues/3566/figure-out-how-to-support-all-of-pgs#comment-22842678 的配方,它说明了您的查询。

【讨论】:

感谢您的帮助,我可以确认这是可行的。我希望你能在未来的版本中找到改进内置 SQLAlchemy PG/JSON 支持的方法! 我希望有一个当前文档包含此支持文档,截至 2019-08-08,SQLAlchemy 和 JSONB 的文档很难挖掘。

以上是关于如何使用 sqlalchemy 查询 jsonb 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何使用spring data jpa查询jsonb列?

如何逃脱? (问号)运算符在 Rails 中查询 Postgresql JSONB 类型

如何在 jsonb 列上使用 Spring JPA 进行查询?

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

Postgresql:搜索jsonb对象数组时如何使用动态值?

如何查询带有数组的jsonb字段