Я использую 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
объектов.