AWS AppSync RDS Resolver插入GeoJSON多边形到PostGIS数据库问题求解
问题根因
- 你当前报错本质是AppSync映射模板生成的JSON格式非法,不是SQL执行阶段的错误。手动拼接GeoJSON字符串时存在两个核心问题:
- 字符串类型的
type字段没有被包裹双引号,生成的GeoJSON片段为{"type": Polygon,...},属于无效JSON格式 - 直接在被双引号包裹的SQL语句中拼接JSON内容,没有处理转义规则,导致整个
statements数组的JSON结构被破坏,触发模板解析失败。
- 字符串类型的
正确写法
不需要手动拼接GeoJSON的各个字段,直接使用AppSync内置的$util.toJson工具方法序列化整个GeoJSON对象,再做好SQL单引号转义即可,修正后的Resolver模板如下:
#set( $region = $ctx.args.region ) #set ( $created_at = $util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ")) #set ( $updated_at = $util.time.nowFormatted("yyyy-MM-dd HH:mm:ssZ")) #set( $geoJsonStr = $util.toJson($region.geo_json) ) ## 转义JSON中的单引号,适配PostgreSQL字符串语法 #set( $geoJsonStr = $geoJsonStr.replace("'", "''") ) { "version": "2018-05-29", "statements": [ "INSERT INTO regions (name, created_at, updated_at, geo_json) VALUES ('$region.name', '$created_at', '$updated_at', ST_GeomFromGeoJSON('$geoJsonStr'))", "SELECT id, created_at, updated_at, name, ST_AsGeoJSON(geo_json) AS geo_json FROM regions WHERE id=lastval()" ] }
额外优化说明
- 原查询语句中写死的
SELECT 3519464替换为lastval(),可以自动获取当前会话刚插入的自增主键ID,适配动态插入场景 - 序列化+转义的方案也可以避免SQL注入风险,比手动拼接字段更安全
内容的提问来源于stack exchange,提问作者hyprstack
相关产品推荐
相关产品推荐

