我可以在sqlalchemy中使用MYSQL空间扩展吗?

时间:2012-05-04 15:08:18

标签: mysql sqlalchemy geospatial

我正在寻找一种将空间数据映射到sqlalchemy对象的方法。有人可以告诉我是否有这样的方式?谢谢!

2 个答案:

答案 0 :(得分:3)

是的,您需要查看GeoAlchemy包。

将列类型添加到名为GeometryColumn的表中。

过滤也是非常流行的。来自文档:

s = session.query(Spot).filter(Spot.geom.kml == '<Point><coordinates>-81.4,38.08</coordinates></Point>').first()

这不过是简单的pip install GeoAlchemy

答案 1 :(得分:1)

我尝试使用GeoAlchemy,但是它不支持MySql。 根据{{​​3}}:

  

GeoAlchemy 2当前不支持PostgreSQL / PostGIS之外的其他方言。

我所做的是创建自定义空间类型:

from sqlalchemy import func
from sqlalchemy.types import UserDefinedType

class Geometry(UserDefinedType):
    def get_col_spec(self):
        return "GEOMETRY"

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

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

假设您的数据库中有address个表, 其中包含带有坐标的空间列。 现在,您可以在模型中使用此自定义类型:

class Address(Base):
    __tablename__ = 'address'
    id = Column(Integer, primary_key=True)
    coordinates = Column(Geometry, nullable=False)

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

address = Address()
address.coordinates = 'POINT(0 0)'

如果您希望SQLAlchemy为此列添加空间索引,则可以使用事件侦听器:

from sqlalchemy import event, DDL
event.listen( Address.__table__ , 'after_create', DDL("ALTER TABLE `address` ADD SPATIAL(`coordinates`)"))