如何用SQLAlchemy从ST_Dump提取geom部分?SQL转Python代码
解决SQLAlchemy中提取ST_Dump返回的geom字段问题
你说得对,ST_Dump返回的是PostGIS的复合类型(geometry_dump),包含path和geom两个部分,所以直接查询会拿到整个复合对象的字符串表示。要单独提取geom部分,只需要在SQLAlchemy里像原生SQL那样访问复合类型的属性就行,具体修改如下:
修改后的代码
from geoalchemy2 import Geometry from sqlalchemy import func, cast data = session.query( func.ST_Dump( func.ST_Linemerge( func.ST_Union( cast(MyTable.geog, Geometry) ) ) ).geom.label('dumped_geom') # 直接访问复合类型的geom属性 ).group_by( MyTable.some_foreign_key )
原理说明
在原生SQL中你用(ST_Dump(...)).geom来提取几何字段,在SQLAlchemy里,对于这类返回复合类型的函数,直接通过.属性名的方式就能生成对应的SQL语法。上面的代码会生成和你目标完全一致的SQL语句:
SELECT (ST_Dump(ST_Linemerge(ST_Union(CAST(my_table.geog AS geometry))))).geom AS dumped_geom FROM my_table GROUP BY my_table.some_foreign_key
执行查询后,dumped_geom会是GeoAlchemy2的Geometry对象,你可以直接用于后续的地理操作,不需要额外处理字符串。
如果遇到版本兼容问题(比如旧版GeoAlchemy2),也可以用func的方式间接提取,不过上面的写法是最直观且和原生SQL对齐的方案,优先推荐。
内容的提问来源于stack exchange,提问作者SS_Rebelious
相关产品推荐
相关产品推荐

