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

JavaScript的pg库执行含PostGIS POINT的预编译SQL报错如何解决

报错原因

  1. 预编译SQL写法错误:ST_GeomFromText 函数的第一个入参要求是标准WKT格式的字符串,你代码里写的 ST_GeomFromText(POINT($3),4326) 没有把 POINT(...) 包裹为字符串,PostgreSQL会把无引号的POINT识别为系统内置的point函数,而不是WKT的文本片段。
  2. 类型匹配歧义:你传入的$3是带逗号的字符串类型坐标,系统无法确定要将这个入参转换为哪种参数类型的point函数重载,因此抛出function point(unknown) is not unique的错误。
  3. 额外注意:你代码里的参数名strenght是拼写错误,正确应为strength,这个问题也可能引发额外报错。

解决方法

方案1:不修改传入参数,直接修正SQL写法

把整个WKT片段拼接为合法字符串即可,和你直接在psql里执行的语句逻辑完全一致:

// 用||拼接字符串生成合法的POINT WKT
let sql = "INSERT INTO waps (bssid, strength, location) VALUES($1,$2, ST_GeomFromText('POINT(' || $3 || ')',4326)) RETURNING id";
// 修正strength拼写
let wapId = await pool.query(sql, [bssid, strength, location]);

方案2(更推荐):拆分坐标为两个数值参数,避免字符串拼接

直接用PostGIS提供的ST_MakePoint函数构造坐标,类型更安全,不会出现字符串格式错误:

// 先把location按逗号拆分转成数值
const [lon, lat] = location.split(',').map(Number);
let sql = "INSERT INTO waps (bssid, strength, location) VALUES($1,$2, ST_SetSRID(ST_MakePoint($3, $4),4326)) RETURNING id";
let wapId = await pool.query(sql, [bssid, strength, lon, lat]);

内容的提问来源于stack exchange,提问作者João Calapez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:02