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

如何在SQLAlchemy的SELECT查询中将表行聚合为列表?

在SQLAlchemy中聚合关联表行为单个列表

要实现将Table3的关联行聚合为JSON列表,与Table1、Table2的列一同返回,核心是利用SQLAlchemy的func调用对应数据库的聚合函数,将Table3的行转换为JSON对象后再聚合。以下分两种常见数据库场景实现:

1. PostgreSQL 场景

PostgreSQL支持json_build_object构造单行的JSON对象,配合array_agg聚合为列表:

from sqlalchemy import func, select

# 构造Table3的JSON对象聚合列
table3_agg = func.array_agg(
    func.json_build_object(
        "table3_col_a", Table3.table3_col_a,
        "table3_col_b", Table3.table3_col_b
    )
).label("table3_col_agg")

# 完整查询
query = (
    select(Table1, Table2, table3_agg)
    .join(Table2, Table2.id == Table1.id, isouter=True)
    .join(Table3, Table3.id == Table1.id, isouter=True)
    .group_by(Table1.id, Table2.id)
    .where(Table1.id == "id_1")
)

注:SQLAlchemy中full=True已废弃,推荐使用外连接语法保证即使Table2/Table3无关联行也能返回结果。

2. MySQL 场景

MySQL使用json_object构造单行JSON,json_arrayagg聚合为列表:

from sqlalchemy import func, select

table3_agg = func.json_arrayagg(
    func.json_object(
        "table3_col_a", Table3.table3_col_a,
        "table3_col_b", Table3.table3_col_b
    )
).label("table3_col_agg")

query = (
    select(Table1, Table2, table3_agg)
    .fullouterjoin(Table2, Table2.id == Table1.id)
    .fullouterjoin(Table3, Table3.id == Table1.id)
    .group_by(Table1.id, Table2.id)
    .where(Table1.id == "id_1")
)

结果验证

执行上述查询后,返回的单行结果中table3_col_agg字段会是符合期望的JSON列表:

[{"table3_col_a":"table3_col_a_cont1","table3_col_b":"table3_col_b_cont1"},{"table3_col_a":"table3_col_a_cont2","table3_col_b":"table3_col_b_cont2"}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 16:24:55