sqlAlchemy преобразует геометрию в байт, используя ST_AsBinary

У меня есть модель 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())

Но столбец с типом geometry преобразуется в Byte[], поэтому полученное выражение sql выглядит так:

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

Что нужно сделать, чтобы избежать преобразования типа геометрии в тип байта?

2 ответа

У меня была такая же проблема, когда я работал с Flask-Sqlalchemy и Geoalchemy2, и я решил ее следующим образом.

Вам просто нужно создать новый подкласс типа GEOMETRY.

Если посмотреть документацию, то приведены аргументы типа "ГЕОМЕТРИЯ":

  • ElementType - тип возвращаемого элемента, по умолчанию это WKBElement (хорошо известный двоичный элемент)
  • as_binary - функция для использования, по умолчанию это 'ST_AsEWKB', что создает проблему в вашем случае
  • from_text - конструктор геометрии, используемый для создания, вставки и обновления элементов, по умолчанию это 'ST_GeomFromEWKT'

Так что я сделал? Я только что создал новый подкласс с необходимой функцией, элементом и конструктором и, как всегда, использовал тип "Geometry" в своих моделях db.

    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.functions импортируем ST_AsGeoJSON

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

Это должно изменить вашу конверсию. В документации по геоалхимии есть много функций преобразования .

Другие вопросы по тегам