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
相关产品推荐
相关产品推荐

