SQLAlchemy根据JSONB中的嵌套键进行过滤

Boa*_*oaz 7 python sql postgresql sqlalchemy jsonb

我有一个JSONB字段,有时有嵌套键.例:

"a simple text"

如果我这样做, "a simple text"
我会得到这个记录.

如何搜索嵌套密钥的存在?("a simple text")

van*_*van 13

使用SQLAlchemy,以下内容适用于您的测试字符串:

class TestMetadata(Base):
    id = Column(Integer, primary_key=True)
    name = Column(String)
    metadata_item = Column(JSONB)
Run Code Online (Sandbox Code Playgroud)

根据SQLAlchemy文档JSONB(搜索Path索引操作示例):

expr = TestMetadata.metadata_item[("nested_field", "a simple text")]
q = (session.query(TestMetadata.id, expr.label("deep_value"))
     .filter(expr != None)
     .all())
Run Code Online (Sandbox Code Playgroud)

应生成SQL以下内容:

SELECT  testmetadata.id AS testmetadata_id, 
        testmetadata.metadata_item #> %(metadata_item_1)s AS deep_value
FROM    testmetadata
WHERE  (testmetadata.metadata_item #> %(metadata_item_1)s) IS NOT NULL
-- @params: {'metadata_item_1': u'{nested_field, a simple text}'}
Run Code Online (Sandbox Code Playgroud)

  • 真棒......恕我直言,目前尚不清楚Path索引是嵌套的JSON,但也许只是我.顺便说一下 - 为了检查一个值,我宁愿使用内部:`.filter(TestMetadata.metadata_item [key] .astext == value)`其中key是元组 (4认同)