[英]Using jsonb_array_elements in sqlalchemy query
我正在使用 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':[]}
refunds {'refunds':[]}
列表中的第一个元素时才有效,而无论退款列表中的位置如何,上面的 SQL 查询都将起作用.
经过大量搜索后,在旧的SQLAlchemy github 问题中似乎有一些临时配方,其中一个谈到在查询中使用jsonb_array_elements
,但我无法完全按照我的方式工作喜欢。
如果它有帮助,我的 Payment.data JSONB 与 Square Connect v1 API 中的 Payment 对象完全一样,我正在尝试使用在refund
对象的嵌套refunds
列表中找到的created_at
日期搜索数据。
使用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 在查询单个实体时只会返回不同的实体。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.