如何使用sqlalchemy和postgres使用嵌套jsonb进行过滤

时间:2019-07-09 01:38:48

标签: python sqlalchemy

我不知道如何使用SQLAlchemy查询包含JSONB数据的表。

JSON结构与此类似:

example = {
  "product": "Widget",
  "version": 1,
  "release_date": "2019-07-01T00:00:00.000Z",
  "widget": {
    "code": "ABCDEF",
    "name": "my widget",
    "uses": {
        "rain": "yes",
        "snow": "no",
        "heat": "sometimes",
...

我正在尝试使用此功能执行查询:

SELECT
    json  AS acdata
FROM
    aircraft.aircraft
WHERE json -> 'widget' -> 'uses' ->> 'rain' = 'No';

采用以下形式:

widget= session.query(Widget).filter_by(rain='No').first()

我知道下雨='不'是不正确的,但是我不知道应该去哪里! 目的是获得第一个其关键部件widget.uses.rain ='No'

的Widget。

我对Widget类有这个定义

from sqlalchemy import Column, Integer, ForeignKey
from sqlalchemy.dialects.postgresql import JSONB, UUID

class Widget(Base):
    __tablename__ = 'widgets'
    __table_args__ = {'schema' : 'factory'}

    id = Column(UUID(as_uuid=True), primary_key=True)
    json = Column(JSONB, nullable=False)
...

1 个答案:

答案 0 :(得分:1)

要访问嵌套的jsonb值,请使用键的元组(路径索引操作),然后使用astext将值转换为文本:

widget = session.query(Widget).\
    filter(Widget.json["widget", "uses", "rain"].astext == 'No').\
    first()

结果查询使用#>>运算符进行路径索引+ astext操作。您不能将filter_by()用于这种谓词,因为它用于对模型类的属性进行简单的相等性检查。