如何使用sqlalchemy查询jsonb数组

时间:2015-10-19 12:38:18

标签: python-3.x sqlalchemy postgresql-9.4

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

答案 0 :(得分:1)

[注意:ASAl 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中的配方,其中说明了查询。