SQL Alchemy的python本机对象在哪里?

SQL Alchemy的python本机对象在哪里?,python,sqlalchemy,postgis,geoalchemy,Python,Sqlalchemy,Postgis,Geoalchemy,在ORM中,我希望能够做到这一点: 取而代之的是,我看到的访问我的湖点的唯一方法是通过一个相当复杂的代码怪物: 当这个循环得到我想要的坐标时,我不知道如何实现一些Lake.get_coast()来返回这个实例的海岸 我也放弃了对具有多个多边形的“Lake”实现相同的功能,因为对于postgis来说,深入到点的嵌套太多了(至少我是这样理解错误消息的) 我不熟悉postgis、gis、python和sqla,但在两天的谷歌搜索中,我在SQL Alchemy 2中找不到任何类似ORM的东西,只有一些S

在ORM中,我希望能够做到这一点:

取而代之的是,我看到的访问我的湖点的唯一方法是通过一个相当复杂的代码怪物:

当这个循环得到我想要的坐标时,我不知道如何实现一些Lake.get_coast()来返回这个实例的海岸

我也放弃了对具有多个多边形的“Lake”实现相同的功能,因为对于postgis来说,深入到点的嵌套太多了(至少我是这样理解错误消息的)


我不熟悉postgis、gis、python和sqla,但在两天的谷歌搜索中,我在SQL Alchemy 2中找不到任何类似ORM的东西,只有一些SQL帮助函数(postgis)可以解析WKB,但在数据库中只能找到。我需要一些额外的框架吗?我看到了gdal,OGR,菲奥娜,但我想朝着错误的方向看。是否有一些使用SQL-Alchemy2的开放源码项目具有良好的结构?实体、DAO等等?除了这个极简主义的例子之外,你如何实际使用这个怪物?

首先,SQLAlchemy实际上是两个独立的部分,核心和ORM。前者只是对SQL的抽象。后者实际上不是一个自动静态地将类映射到表的传统ORM;它是一个用于在类和关系代数引擎(如SQLAlchemy Core)之间构建数据映射器的框架。您可能应该阅读和,如果您还没有阅读,然后通读一些示例。我以前读过这些页面,但在本例中,它实际上是一个地理炼金术问题。有了字符串和数字,ORM的魔力就如预期的那样起作用了,但GIS的东西太疯狂了。查询(Office)会产生一个真正的Office对象,它包含所有的工作对象,而不是几何体,它不会以这种方式工作。我从未使用过地球炼金术。您始终可以自己构建映射器,以将几何体对象连接到关系引擎。但希望您能得到更好的答案。您可以使用ST_GeometryN访问多多边形中的多边形,请参见
session.add(Lake("hello",Polygon([(0,0),(1,0),(1,1)])))
lake = session.get(Lake).first()
assert isinstance(lake.geometry, Polygon)
assert isinstance(lake.geometry.get_exterior_ring().get_points()[0], Point)
print(lake.geometry.get_exterior_ring().get_points()[0].x)
ring = func.ST_ExteriorRing(func.ST_GeomFromWKB(Lake.geometry))
node_count = func.ST_NPoints(ring)
node_series = func.generate_series(1, node_count)
node_n = func.ST_PointN(ring, node_series)
node_n_x = func.ST_X(node_n)
node_n_y = func.ST_Y(node_n)
rows = session.query(Lake, node_n_x, node_n_y).all()
lake_coasts = {}
for row in rows:
    lake = row[0]
    if not lake in lake_coasts:
        lake_coasts[lake] = []
    lake_coast = lake_coasts[lake]
    lake_coast.append((row[1], row[2]))
for lake in lake_coasts:
    lake_coast = lake_coasts[lake]
    print("Lake #{0}: \"{1}\" has its coasts at {2}"
          .format(lake.id, lake.name, lake_coast))