gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:33:57 26 4
gpt4 key购买 nike

我正在尝试使用 SQLAlchemy(0.8)/GeoAlchemy2(0.2.1) 复制嵌套的原始 PostGreSQL/PostGIS 栅格查询,但不知道如何访问 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))

但该语法不起作用,否则我不会发布此问题 ;)。有人有想法吗?谢谢!

最佳答案

解决方案最终变得相当简单:

首先,定义一个自定义的GeomvalType,继承geoalchemy2的CompositeType并指定typemap特定于geomval:

class GeomvalType(ga2.types.CompositeType):
typemap = {'geom':ga2.Geometry('MULTIPOLYGON'),'val':Float}

接下来,使用type_coerceST_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))

关于postgresql - 如何在 SQLAlchemy 中使用复合数据类型(例如 geomval)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17704563/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com