通过阅读这里的其他文章,我明白了错误是什么,只是不知道如何在我的用例中修复它。我正在使用for循环构建一个查询,它将在我的数据库中插入多行。
const id = req.body.user_id;
const data = req.body.data;
let queryString = '';
let venue_ids = ``;
for (let i = 2; i < data.length + 2; i++) {
if (i === data.length + 1) {
queryString += `($1, $${i})`;
venue_ids += `${data[i - 2].id}`;
} else {
queryString += `($1, $${i}), `;
venue_ids += `${data[i - 2].id}, `;
}
}
我可以记录到字符串,得到querystring=($1,$2),($1,$3),($1,$4),($1,$5),($1,$6),($1,$7),($1,$8),($1,$9),($1,$10),($1,$11)
和venue_ids=10,9,8,7,6,5,4,1,3,2
。
接下来我尝试进行查询:
let sqlText = `INSERT INTO user_matches (user_id, venue_id) VALUES ${queryString}`;
pool
.query(sqlText, [id, venue_ids])
.then((response) => {
res.send(response.rows);
})
.catch((err) => {
console.log('Error saving venue matches', err);
});
我得到的错误是绑定消息提供2个参数,但准备好的语句“”需要11
。所以我看到了正在发生的事情,我的VENUE_IDS
被解释为一个变量,而我希望它是变量中的变量,如果这有意义的话。
知道怎么解决吗?
我能够通过对整个绑定数组使用变量binded_ids
来修复我的问题。
let binded_ids = [id];
for (let i = 2; i < data.length + 2; i++) {
if (i === data.length + 1) {
queryString += `($1, $${i})`;
binded_ids.push(data[i - 2].id);
} else {
queryString += `($1, $${i}), `;
binded_ids.push(data[i - 2].id);
}
}
然后是我的问题:
let sqlText = `INSERT INTO user_matches (user_id, venue_id) VALUES ${queryString}`;
pool
.query(sqlText, binded_ids)
.then((response) => {
res.send(response.rows);
})
.catch((err) => {
console.log('Error saving venue matches', err);
});