1

我有一个 sqlAlchemy 模型,它有一列几何类型,定义如下:

point_geom = Column(Geometry('POINT'), index=True)

我正在使用 geoalchemy2 模块:

from geoalchemy2 import Geometry

然后我使用 sqlAlchemy ORM 进行查询,一切正常。例如:

数据 = session.query(myModel).filter_by(...)

我的问题是,当我需要获取查询对象的sql语句时,我使用如下代码:

sql = data.statement.compile(dialect=postgresql.dialect())

但是geometry类型的列被转换为Byte[],所以得到的sql语句是这样的:

SELECT column_a, column_b, ST_AsBinary(point_geom) AS point_geom 
FROM tablename WHERE ...

应该怎么做才能避免将几何类型转换为字节类型?

4

1 回答 1

0

我在使用 Flask-Sqlalchemy 和 Geoalchemy2 时遇到了同样的问题,并按如下方式解决了这个问题。

您只需要创建一个 GEOMETRY 类型的新子类。

如果您查看文档,则会给出“GEOMETRY”类型的参数:

  • ElementType - 返回元素的类型,默认为'WKBElement' ( Well-known-binary-element )
  • as_binary - 要使用的函数,默认情况下它是“ST_AsEWKB”,这会对您的情况造成问题
  • from_text - 用于创建、插入和更新元素的几何构造函数,默认为'ST_GeomFromEWKT'

那我做了什么?我刚刚创建了具有所需函数、元素和构造函数的新子类,并像往常一样在我的数据库模型上使用了“几何”类型。

    from geoalchemy2 import Geometry as BaseGeometry
    from geoalchemy2.elements import WKTElement
    
    
    class Geometry(BaseGeometry):
        from_text = 'ST_GeomFromText'
        as_binary = 'ST_asText'
        ElementType = WKTElement

如您所见,我只更改了基类的这 3 个参数。这将返回一个包含所需列变量的字符串。

于 2020-08-07T04:09:56.827 回答