sqlAlchemy使用ST_AsBinary

时间:2016-05-04 14:56:33

标签: sqlalchemy geoalchemy2

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

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

我正在使用geoalchemy2模块:

from geoalchemy2 import Geometry

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

data = session.query(myModel).filter_by(...)

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

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

但是几何类型的列被转换为Byte [],因此生成的sql语句是这样的:

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

应该采取哪些措施来避免将几何类型转换为字节类型?

1 个答案:

答案 0 :(得分:0)

使用Flask-Sqlalchemy和Geoalchemy2时,我遇到了相同的问题,并按以下方法解决了此问题。

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

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

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

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

    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个参数。 这将返回带有必需列变量的字符串。