sqlAlchemy使用ST_AsBinary将几何图形转换为字节



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

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

我正在使用geoalchemy2模块:

from geoalchemy2 import Geometry

然后我使用sqlAlchemyORM进行查询,一切都很好。例如:

data=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 ...

应该做些什么来避免将几何图形类型转换为字节类型?

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

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

如果你看一下文件;几何;给出了类型:

  • ElementType-返回元素的类型,默认情况下为'WKElement'众所周知的二进制元素
  • 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个参数。这将返回一个包含必需列变量的字符串。

它认为您可以在查询中指定它。类似于以下内容:从geoalchemy2.函数导入ST_AsGeoJSON

query = session.query(ST_AsGeoJSON(YourModel.geom_column))

这应该会改变你的转变。中有许多转换函数地理炼金术文档。

最新更新