Как использовать составные типы данных (например, Geomval) в SQLAlchemy?
Я пытаюсь реплицировать вложенный необработанный растровый запрос PostGreSQL/PostGIS с помощью SQLAlchemy(0.8)/GeoAlchemy2(0.2.1) и не могу понять, как получить доступ к компонентам типа данных geomval. Это составной тип данных, который возвращает "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))
Но этот синтаксис не работает, иначе я бы не стал публиковать этот вопрос;). У кого-нибудь есть идеи? Спасибо!
1 ответ
Решение оказалось довольно простым:
Сначала определите пользовательский GeomvalType, наследуя CompositeType в geoalchemy2 и указав карту типов, специфичную для geomval:
class GeomvalType(ga2.types.CompositeType):
typemap = {'geom':ga2.Geometry('MULTIPOLYGON'),'val':Float}
Затем используйте type_coerce для приведения результата ST_DumpAsPolygons к GeomvalType в начальном запросе:
q = session.query(type_coerce(ga2.func.ST_DumpAsPolygons(my_raster_table.c.rast), GeomvalType()).label('dap'))
Наконец, доступ к нему (успешно!) Из подзапроса, как я пытался до этого:
q2 = session.query(ga2.func.ST_Area(q.subquery().c.dap.geom))