1

我正在尝试使用 SQLalchemy 和 geoalchemy2 创建一个表,如下所示:

class RLocModel(Base):
    __tablename__ = 'rloc'
    id = Column(Integer, primary_key=True)
    loc = Column(Geometry('POINT'))                     

这是针对 mysql 数据库(实际上是与 AWS mysql 兼容的 Aurora 数据库)。

我得到一个例外如下:

(_mysql_exceptions.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(POINT,-1), \n\tPRIMARY KEY (id)\n)' at line 3") [SQL: '\nCREATE TABLE rloc (\n\tid INTEGER NOT NULL AUTO_INCREMENT, \n\tloc geometry(POINT,-1), \n\tPRIMARY KEY (id)\n)\n\n']

我不确定它是否表达了正确的方言。

我可以这样手动执行此操作:

CREATE TABLE `geo` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `loc` geometry NOT NULL,
  PRIMARY KEY (`id`),
  SPATIAL KEY `loc` (`loc`)
) ENGINE=InnoDB AUTO_INCREMENT=11905 DEFAULT CHARSET=latin1;

有任何想法吗?

4

2 回答 2

3

根据文件

注意:GeoAlchemy 2 目前不支持 PostgreSQL/PostGIS 以外的其他方言。

您可以做的是创建自定义Point类型:

from sqlalchemy import func
from sqlalchemy.types import UserDefinedType

class Point(UserDefinedType):
    def get_col_spec(self):
        return "POINT"

    def bind_expression(self, bindvalue):
        return func.ST_GeomFromText(bindvalue, type_=self)

    def column_expression(self, col):
        return func.ST_AsText(col, type_=self)

现在,您只需在模型中使用此自定义类型:

class RLocModel(Base):
    __tablename__ = 'rloc'
    id = Column(Integer, primary_key=True)
    loc = Column(Point, nullable=False)

然后你可以像这样使用你的模型:

geo = RLocModel()
geo.loc = 'POINT(0 0)'
于 2018-07-28T08:58:03.623 回答
0

如果有人正在寻找 SRID 支持,下面是 @adrihanu 的支持答案的修改版本。

from sqlalchemy import func
from sqlalchemy.types import UserDefinedType

class Point(UserDefinedType):
    def get_col_spec(self):
        return "POINT SRID 4326"

    def bind_expression(self, bindvalue):
        return func.ST_GeomFromText(bindvalue, 4326, type_=self)

    def column_expression(self, col):
        return func.ST_AsText(col, type_=self)

其余的都是一样的

class RLocModel(Base):
    __tablename__ = 'rloc'
    id = Column(Integer, primary_key=True)
    loc = Column(Point, nullable=False)

正在使用

geo = RLocModel()
geo.loc = 'POINT(40.7647919738352, -73.99207372979897)'
于 2021-06-11T20:39:51.460 回答