2015-10-19 81 views
3

我有存儲在jsonb場像這樣的數據: 如何查詢jsonb陣列SQLAlchemy的

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

[注中提取的字段查詢: AS OF 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中的說明您的查詢的配方。

+0

感謝您的幫助,我可以確認此作品。我希望你找到一種方法來改進將來版本中內置的SQLAlchemy PG/JSON支持! –