Использование jsonb_array_elements в запросе sqlalchemy - PullRequest
0 голосов
/ 22 января 2019

Я использую SQLAlchemy ORM и пытаюсь выяснить, как создать запрос PostgreSQL, например:

SELECT
    payments.*
FROM
    payments,
    jsonb_array_elements(payments.data #> '{refunds}') refunds
WHERE
    (refunds ->> 'created_at')
        BETWEEN '2018-12-01T19:30:38Z' AND '2018-12-02T19:30:38Z';

Хотя с начальной датой включительно и исключительной датой остановки.

Мне удалось приблизиться к:

refundsInDB = db_session.query(Payment).\
    filter(Payment.data['refunds', 0, 'created_at'].astext >= startTime,
           Payment.data['refunds', 0, 'created_at'].astext < stopTime ).\
    all()

Однако это работает только в том случае, если возврат (который является вложенным массивом в данных JSONB) является первым элементом в списке {'refunds':[]} в то время как приведенный выше SQL-запрос будет работать независимо от позиции в списке возврата.

После долгого поиска кажется, что в старой проблеме SQLAlchemy github есть некоторые временные рецепты ,один из которых говорит об использовании jsonb_array_elements в запросе, но я не смог заставить его работать так, как мне хотелось бы.

Если это поможет, то мой Payment.data JSONB точно такой же, какПлатежный объект из Square Connect v1 API , и я пытаюсь найти данные, используя дату created_at, найденную во вложенном refunds списке refund объектов.

1 Ответ

0 голосов
/ 22 января 2019

Используйте Query.select_from() и псевдоним выражения функции для выполнения запроса:

# Create a column object for referencing the `value` attribute produced by
# the set of jsonb_array_elements
val = db.column('value', type_=JSONB)

refundsInDB = db_session.query(Payment).\
    select_from(
        Payment,
        func.jsonb_array_elements(Payment.data['refunds']).alias()).\
    filter(val['created_at'].astext >= startTime,
           val['created_at'].astext < stopTime ).\
    all()

Обратите внимание, что удаление массива jsonb и фильтрация на основеон может создать несколько строк на Payment, но SQLAlchemy будет возвращать только разные сущности при запросе для одной сущности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...