2015-10-19 6 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]} 

Я хочу чтобы определить максимальную глубину для каждой записи и выработал следующий запрос в raw 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 

Поскольку я использую ORM SQLAlchemy в своем приложении, я хочу написать этот запрос с ORM SQLAlchemy, но я не могу придумать правильную форму.

Я думал, мне нужно что-то вроде этого:

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, 26 октября 2015 года. Это может измениться в будущем выпуске], эти специальные синтаксисы PG не встроены в SQLAlchemy прямо сейчас, см. Рецепт на https://bitbucket.org/zzzeek/sqlalchemy/issues/3566/figure-out-how-to-support-all-of-pgs#comment-22842678, который иллюстрирует ваш запрос.

+0

Спасибо за помощь, я могу подтвердить это. Надеюсь, вы найдете способ улучшить встроенную поддержку SQLAlchemy PG/JSON в будущих версиях! –

Смежные вопросы