我正在使用NodeJS和pg以及PostgreSQL数据库作为后端。我想在一条语句中将多行插入到一个表中,使用id(即BIGSERIAL PRIMARY KEY NOT NULL)来检查是否是要插入而不是更新的新记录。
如果我创建查询,只是像这样传递值,它就可以工作了:
let upsertQuery = `INSERT INTO triage (id, col1, col2)
VALUES (1, 'abc', 'def'), (DEFAULT, 'ghi', 'jkl')
ON CONFLICT (id) DO UPDATE SET
col1 = EXCLUDED.col1,
col2 = EXCLUDED.col2`;
但是如果我使用参数来避免SQL注入,就像这样:
let upsertQuery = `INSERT INTO triage (id, col1, col2)
VALUES ($1, $2, $3), ($4, $5, $6)
ON CONFLICT (id) DO UPDATE SET
col1 = EXCLUDED.col1,
col2 = EXCLUDED.col2`;
let values = [1, 'abc', 'def', 'DEFAULT', 'ghi', 'jkl']
try {
await pool.query(upsertQuery, values)
res.status(201).json({message:'Updated'});
}
catch(err) {
await pool.query('ROLLBACK');
console.log(JSON.stringify(err, null, 2));
}
错误是:
“name”:“error”,“severity”:“ERROR”,“code”:“22P02”,“where”:“未命名的门户参数$4 = '...'",“文件”:“numutils.c”,“routine”:“pg_strtoint64”
1条答案
按热度按时间kcwpcxri1#
我猜你是在把字符串
'DEFAULT'
作为values
数组中id
字段的值传递。id
字段的类型为BIGSERIAL
,它需要一个整数值,而不是字符串“DEFAULT”。像下面这样修改你的代码