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))
Это должно изменить вашу конверсию. В документации по геоалхимии есть много функций преобразования .