PostgreSQL插入created_on日期字段时报‘16’附近语法错误
报错核心原因
你通过字符串拼接生成SQL语句时,没有给created_on字段对应的日期值加上SQL语法要求的单引号包裹。
你实际拼出来的SQL片段是:VALUES(2021-03-14 16:25:05,1,1)
数据库解析这段内容时,会把无引号的2021-03-14识别为算术运算表达式,碰到第一个空格就中断了值的识别流程,紧跟着遇到的16完全不符合SQL语法规则,因此直接抛出了定位在16位置的语法错误。
修复方案
- 最小改动修复:给拼接的日期值手动补上单引号,将原SQL赋值行修改为:
const value= \INSERT INTO price(created_on,something1, something2)VALUES('${e}',1,1)`;`
修改后拼出的日期值会被单引号包裹为合法的日期字面量,数据库可以正常识别解析。 - 长期更稳妥的写法:不要手动拼接原始SQL字符串,改用node-postgres支持的参数化(预编译)查询传值,既可以避免手动拼语句带来的格式问题,也能从根源上规避SQL注入风险,示例代码如下:
// 无需手动做日期格式的字符串转换,直接传入原生Date对象即可 const queryConfig = { text: 'INSERT INTO price(created_on, something1, something2) VALUES($1, $2, $3)', values: [new Date(), 1, 1] } client.query(queryConfig, (err, res) => { console.log(err, res); client.end(); });
内容的提问来源于stack exchange,提问作者pete
相关产品推荐
相关产品推荐

