使用node-postgres的参数化查询不在引号之间传递

时间:2017-02-11 18:32:13

标签: node.js postgresql

我正在使用带有Node.js的npm模块pg,并且具有以下查询:

query = "SELECT * FROM territories WHERE '($1, -122.26), (47.57, -122.36)'::box \ 
         @> point(nwlat, nwlng) ORDER BY nwlat, nwlng;"
client.query(query, [lat+.05], callback);

当我运行它时,我收到以下错误:

invalid input syntax for type box: "($1, -122.26), (47.57, -122.36)"

但是当我用$1之类的十进制文字替换47.67时,它会正常执行。我做错了什么?

2 个答案:

答案 0 :(得分:1)

你的问题是:

'$1'

在其中没有占位符,它是一个字符串文字,恰好包含一些看起来像编号占位符的字符。所以这个:

'($1, -122.26), (47.57, -122.36)'

也没有占位符,这只是一个恰好包含字符$1的字符串文字。考虑一下这个区别:

let x = 6;
let y = 'x'; // String that contains the name of a variable.

和此:

let x = 6;
let y = x;  // The actual variable itself.

在JavaScript中,同样的想法。

您可以使用字符串连接构建box字符串:

WHERE ('(' || $1 || ', -122.26), (47.57, -122.36)')::box

但那不是很漂亮。一个更清洁的解决方案是使用point and box functions

绕过字符串并完全投射
WHERE box(point($1, -122.26), point(47.57, -122.36))

答案 1 :(得分:0)

延长@mu的答案太短

使用pg-promise查询格式,您可以得到您期望的结果;)