You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLAlchemy中获取PostgreSQL jsonb_each返回record的key字段?

如何用SQLAlchemy实现PostgreSQL中访问jsonb_each返回record的字段?

我有一个返回record的查询,需要访问该record的某个字段。在PostgreSQL中可通过以下语句实现(items.properties为jsonb列):

SELECT (p).key FROM items, jsonb_each(items.properties) p;

我目前编写了如下SQLAlchemy代码:

properties_data = func.jsonb_each(ItemModel.properties).alias("p")
q = db.query(properties_data).select_from(ItemModel)

这段代码生成的SQL如下,但我无法找到访问p的key字段的方法:

SELECT p.jsonb_each_1 AS p_jsonb_each_1 
FROM stac.items, jsonb_each(stac.items.properties) AS p

注:我不想在Python中返回值后再访问key,而是要将此查询作为子查询用于另一个查询。


解决方案

要直接在SQL层面访问jsonb_each返回的record的key字段,你可以通过以下方式实现:

方法1:通过别名对象的.c.key访问

当你用alias("p")给jsonb_each的结果起别名后,可以直接通过别名的.c.key来引用key字段,这是SQLAlchemy处理复合类型返回值的标准方式:

properties_data = func.jsonb_each(ItemModel.properties).alias("p")
q = db.query(properties_data.c.key).select_from(ItemModel)

这段代码会生成符合预期的SQL:

SELECT p.key 
FROM stac.items, jsonb_each(stac.items.properties) AS p

方法2:使用tuple_结合索引访问

如果第一种方法出现兼容问题,也可以用tuple_包裹别名后的结果,通过索引获取key(jsonb_each返回的record中,key是第一个元素,value是第二个):

from sqlalchemy import tuple_

properties_data = func.jsonb_each(ItemModel.properties).alias("p")
q = db.query(tuple_(properties_data).get(0)).select_from(ItemModel)

这会生成和原生SQLSELECT (p).key等价的查询语句。

作为子查询使用

如果要将这个查询作为子查询嵌入其他查询,只需将其转为子查询后引用字段即可:

properties_data = func.jsonb_each(ItemModel.properties).alias("p")
subq = db.query(properties_data.c.key.label("prop_key")).select_from(ItemModel).subquery()

# 示例:在主查询中关联子查询
main_query = db.query(ItemModel.id).join(subq, ...)

内容的提问来源于stack exchange,提问作者kaveh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:30:35