繁体   English   中英

在 sqlalchemy 查询中使用 jsonb_array_elements

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM