Postgresql 如何在SQLAlchemy中使用复合数据类型(例如geomval)?

Postgresql 如何在SQLAlchemy中使用复合数据类型(例如geomval)?,postgresql,sqlalchemy,postgis,raster,geoalchemy,Postgresql,Sqlalchemy,Postgis,Raster,Geoalchemy,我正在尝试使用SQLAlchemy(0.8)/GeoAlchemy2(0.2.1)复制嵌套的原始PostGreSQL/PostGIS光栅查询,但不知道如何访问数据类型的组件。它是一种复合数据类型,返回“geom”和“val” 以下是有效的原始查询: SELECT (dap).val, (dap).geom FROM (SELECT ST_DumpAsPolygons(rast) as dap FROM my_raster_table) thing 我目前正在处理的SQLAlchemy查询: i

我正在尝试使用SQLAlchemy(0.8)/GeoAlchemy2(0.2.1)复制嵌套的原始PostGreSQL/PostGIS光栅查询,但不知道如何访问数据类型的组件。它是一种复合数据类型,返回“geom”和“val”

以下是有效的原始查询:

SELECT (dap).val, (dap).geom
FROM (SELECT ST_DumpAsPolygons(rast) as dap FROM my_raster_table) thing
我目前正在处理的SQLAlchemy查询:

import geoalchemy2 as ga2
from sqlalchemy import *
from sqlalchemy.orm import sessionmaker

metadata = MetaData()
my_raster_table = Table('my_raster_table', metadata,
                  Column('rid', Integer),
                  Column('rast', ga2.Raster))

engine = create_engine(my_conn_str)
session = sessionmaker(engine)()

q = session.query(ga2.func.ST_DumpAsPolygons(my_raster_table.c.rast).label('dap'))
然后我想在子查询中访问它,类似这样:

q2 = session.query(ga2.func.ST_Area(q.subquery().c.dap.geom))
q2 = session.query(ga2.func.ST_Area(q.subquery().c.dap.geom))

但是这种语法不起作用,否则我就不会发布这个问题;)。有人有想法吗?谢谢

解决方案非常简单:

首先,定义一个自定义的GeomvalType,继承geoalchemy2的复合类型,并指定特定于geomval的类型映射

class GeomvalType(ga2.types.CompositeType):
    typemap = {'geom':ga2.Geometry('MULTIPOLYGON'),'val':Float}
接下来,在初始查询中,使用type_-concureST_-DumpAsPolygons结果强制转换为GeomvalType

q = session.query(type_coerce(ga2.func.ST_DumpAsPolygons(my_raster_table.c.rast), GeomvalType()).label('dap'))
最后,像我之前尝试的那样,从子查询访问它(成功!):