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。
修复方案
- 先将传入的Python字典格式的geometry序列化为标准JSON字符串,适配
ST_GeomFromGeoJSON的入参要求 - 改用psycopg2参数化查询传递参数,不要使用字符串格式化拼接SQL,自动处理特殊字符转义,同时避免SQL注入风险
- 修正函数调用逻辑,正确获取几何对象的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
相关产品推荐
相关产品推荐

