首页 > 解决方案 > Postgresql 绑定一个变量的变量

问题描述

通过阅读此处的其他帖子,我了解错误是什么,我只是不知道如何在我的用例中修复它。我正在使用 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)and 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);
    });

我得到的错误是bind message supplies 2 parameters, but prepared statement "" requires 11. 所以我看到正在发生的事情venue_ids,当我希望它成为一个变量时,我被解释为一个变量,如果这有意义的话。

知道如何解决这个问题吗?

标签: javascriptnode.jspostgresql

解决方案


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);
    });

推荐阅读