JavaScript的pg库执行含PostGIS POINT的预编译SQL报错如何解决
报错原因
- 预编译SQL写法错误:
ST_GeomFromText函数的第一个入参要求是标准WKT格式的字符串,你代码里写的ST_GeomFromText(POINT($3),4326)没有把POINT(...)包裹为字符串,PostgreSQL会把无引号的POINT识别为系统内置的point函数,而不是WKT的文本片段。 - 类型匹配歧义:你传入的$3是带逗号的字符串类型坐标,系统无法确定要将这个入参转换为哪种参数类型的point函数重载,因此抛出
function point(unknown) is not unique的错误。 - 额外注意:你代码里的参数名
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
相关产品推荐
相关产品推荐

