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

SQLAlchemy中使用array_agg聚合完整模型实例的问题

解决SQLAlchemy中聚合完整模型实例数组的问题

要在SQLAlchemy中实现与原生SQL相同的效果,你需要调整array_agg的参数——直接传入模型类会被SQLAlchemy视为非法的SQL字面量。以下是具体解决方案:

1. 修正查询代码

将array_agg(Tiletemplate)替换为array_agg(Tiletemplate.__table__),这样SQLAlchemy会生成与原生SQL一致的array_agg(tiletemplate)语句,正确引用表的行类型进行聚合:

from sqlalchemy import func

# 修正后的查询
result = session.execute(
    select(
        Boundingbox,
        func.array_agg(Tiletemplate.__table__).label("tiletemplate")
    ).where(
        Boundingbox.filepath == "<filepath>"
    ).join(
        Tiletemplate,
        Tiletemplate.geom.ST_Intersects(Boundingbox.geom)
    ).group_by(Boundingbox)
).first()

2. 将聚合结果转换为模型实例

查询返回的tiletemplate字段是PostgreSQL的复合类型数组,需要手动转换为Tiletemplate实例:

if result:
    boundingbox = result[0]
    # 将每个复合记录转换为Tiletemplate实例
    tiletemplates = [Tiletemplate(**dict(item)) for item in result.tiletemplate]

原代码报错原因

原生SQL中array_agg(tiletemplate)引用的是表的行对象,而SQLAlchemy中直接传入Tiletemplate模型类时,它无法将其解析为合法的SQL表达式。使用Tiletemplate.__table__则明确告诉SQLAlchemy要引用表的行类型,与原生SQL的逻辑完全匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 18:23:15