Как использовать составные типы данных (например, 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))
Другие вопросы по тегам