You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

psycopg2调用PostGIS的ST_GeomFromGeoJSON传入geometry参数报错如何解决?

问题原因
  • 误用Find_SRID函数:该函数用于查询PostGIS数据表中几何字段的SRID,入参为模式名、表名、几何字段名,无法直接传入GeoJSON几何对象查询SRID,查询单个几何对象的SRID需要使用ST_SRID函数
  • 直接通过字符串格式化将Python字典对象拼接入SQL语句,输出到SQL中的是Python字典的原生字符串表示(带单引号),不符合PostgreSQL的JSON语法要求
  • 手动添加单引号包裹参数后,字典内部的单引号和外层单引号冲突,直接触发SQL语法错误
  • ST_GeomFromGeoJSON的返回值是几何对象,需要嵌套ST_SRID才能拿到对应的SRID数值,如果传入的GeoJSON本身不带SRID信息,默认返回的SRID为0。
修复方案
  1. 先将传入的Python字典格式的geometry序列化为标准JSON字符串,适配ST_GeomFromGeoJSON的入参要求
  2. 改用psycopg2参数化查询传递参数,不要使用字符串格式化拼接SQL,自动处理特殊字符转义,同时避免SQL注入风险
  3. 修正函数调用逻辑,正确获取几何对象的SRID

正确代码示例

import json

def executeForFindSRID(self, geometry):
    print(geometry)
    # 将Python字典序列化为标准JSON字符串
    geom_json = json.dumps(geometry)
    # 使用%s作为参数占位符,不要做字符串拼接
    query = """
    SELECT
        ST_SRID(ST_GeomFromGeoJSON(%s)) AS geometry_srid
    """
    # 参数放到查询方法的第二个参数列表中传递,psycopg2会自动处理转义
    data = self.connection.query(query, [geom_json])
    return data

如果你的GeoJSON本身没有携带SRID信息,返回结果为0的话,可以在构造几何对象时手动指定已知的SRID(你示例中的GeoJSON对应EPSG:25832),修改查询语句即可:

SELECT
    ST_SRID(ST_GeomFromGeoJSON(%s, 25832)) AS geometry_srid

内容的提问来源于stack exchange,提问作者Amrmsmb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:45:03