【问题标题】:How to define a geometry field with Peewee Models如何使用 Peewee 模型定义几何字段
【发布时间】:2020-07-23 14:05:20
【问题描述】:

我已经在网上查看了有关如何使用 peewee 创建几何字段的示例,这是我目前想到的:

class GeometryField(Field):
    db_field = 'geometry'

    def db_value(self, value):
        return fn.ST_GeomFromGeoJSON(value)

    def python_value(self, value):
        return fn.ST_AsGeoJSON(value) 

我已将此定义添加到如下表中:

class GeoJSON(BaseModel):

    geojson_id = UUIDField(primary_key=True, default=uuid.uuid4)
    geometry = GeometryField()

现在,这件事无法运行,我不明白我错过了什么才能让它发生。 我的目标是管理几何实体到数据库中的插入,以便以后可以使用 PostGIS 根据位置进行查询。

我在初始化阶段遇到的错误:

peewee.ProgrammingError:“NOT”第 1 行或附近的语法错误: ...geojson_id" UUID NOT NULL PRIMARY KEY, "geometry" NOT NULL)

我这样初始化表:

        GeoJSON.create_table("geojsons")

我在这里错过了什么?在可以使用这个几何场之前我还需要做任何其他事情吗? Peewee 是否有一个我不知道的开箱即用的秘密 geom 字段?

【问题讨论】:

  • 您的数据库是否真的支持 UUID 字段类型?您必须“安装” uuid-ossp 扩展才能在 PG 中使用 UUID 数据类型。
  • 我解决了最初的问题,@coleifer。没有安装 PostGIS。不过,我确实注意到了其他一些事情,你可能会帮助我。为什么 python_value() 方法实际上没有将值作为 GeoJSON 返回?它改为返回一个函数对象。

标签: postgresql postgis peewee


【解决方案1】:

问题是数据库未能安装 PostGIS,因此无法识别数据库中的几何字段。 一旦我解决了这个问题并安装了扩展程序,上面的解决方案就可以完美运行。

【讨论】:

    【解决方案2】:

    如果您稍后再回答这个问题。 Peewee 语法自 3.0 版以来已更改。 db_field 已更改为 field_type

    所以要让它工作:

    1. 确保在您的 postgres 数据库上安装 PostGIS 扩展。
      CREATE EXTENSION postgis;
    2. 创建自定义字段。
    class GeometryField(Field):
        field_type = 'geometry'
    
        def db_value(self, value):
            return fn.ST_GeomFromGeoJSON(value)
    
        def python_value(self, value):
            return fn.ST_AsGeoJSON(value) 
    
    1. 在模型中使用自定义字段
    class GeoJSON(BaseModel):
        geojson_id = UUIDField(primary_key=True, default=uuid.uuid4)
        geometry = GeometryField()
    

    Peewee Docs

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多