【问题标题】:SQLALchemy: Query a single key or subset of keys of a Postgres JSONB columnSQLALchemy:查询 Postgres JSONB 列的单个键或键子集
【发布时间】:2023-03-16 11:24:01
【问题描述】:

我有一个包含 JSONB 列的 Postgres 表。如何在 SQLAlchemy 中不一次加载整个列的情况下查询该列的数据?

假设 JSONB 列 myjsonb 包含 {'a': 1, 'b': 2, 'c': 3, ... 'z': 26}。我只想要 'a' 的值,而不是全部 26 个值。我如何指定一个查询来做到这一点?

例如,

query = session.query(MyTable).options(defer('myjsonb')).join(MyTable.myjsonb['a'])

不起作用。

知道我如何只能检索'a' 吗?如果不存在密钥'a' 会发生什么?我怎样才能加载多个键,比如'b' 到 'f',但不能同时加载所有键?谢谢!

【问题讨论】:

    标签: python json postgresql orm sqlalchemy


    【解决方案1】:

    这实际上非常简单,您只需查询您感兴趣的键:

    query = session.query(MyTable.myjsonb['a'])
    

    如果你想要来自 json 对象的多个键,比如 ac,你可以这样做

    query = session.query(MyTable.myjsonb['a'], MyTable.myjsonb['c'])
    

    如果任何键不存在,它将只为该行返回None

    【讨论】:

    • 不幸的是,这不起作用,我要么得到:NotImplementedError: Operator 'getitem' is not supported on this expression,要么得到AttributeError: 'Table' object has no attribute 'measurements',如果我这样做MyTable.__table__.myjsonb['a']
    • duh,我使用jsonfield 在我们的开发 sqlite 数据库中允许 json。删除它,一切都按预期工作。谢谢!
    猜你喜欢
    • 2021-07-27
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多