postgresql 如何从node.js将DEFAULT作为id的新记录更新到Postgres

eh57zj3b  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(139)

我正在使用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”

kcwpcxri

kcwpcxri1#

我猜你是在把字符串'DEFAULT'作为values数组中id字段的值传递。id字段的类型为BIGSERIAL,它需要一个整数值,而不是字符串“DEFAULT”。
像下面这样修改你的代码

let upsertQuery = `INSERT INTO triage (id, col1, col2)
    VALUES ($1, $2, $3), (DEFAULT, $4, $5)
    ON CONFLICT (id) DO UPDATE SET
      col1 = EXCLUDED.col1,
      col2 = EXCLUDED.col2`;

let values = [1, 'abc', 'def', '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));
}

相关问题