提问者:小点点

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)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被解释为一个变量,而我希望它是变量中的变量,如果这有意义的话。

知道怎么解决吗?


共1个答案

匿名用户

我能够通过对整个绑定数组使用变量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);
    });