【问题标题】:Pass array to postgresql query - nodejs将数组传递给 postgresql 查询 - nodejs
【发布时间】:2019-02-05 01:55:11
【问题描述】:

我似乎在将数组传递给我的查询并使用IN 条件时遇到问题,当我手动将每个搜索词添加到查询中时,我可以成功返回结果

async function getFixtures() {
  let response;
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ('Chinese Super League', 'Iran Pro League', 'English Premier League')");
  } catch (e) {
    console.error('Error Occurred', e);
  }
    return response.rows;
}

当我尝试传递一个数组时,虽然我没有得到任何结果

async function getFixtures(leaguesArray) {
  let response;
  try {
    response = await pool.query("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray]);
  } catch (e) {
    console.error('Error Occurred', e);
  }
    return response.rows;
}

当我退出 leaguesArray 时它会返回

['Chinese Super League', 'Iran Pro League', 'English Premier League']

所以当它被传递给查询时,我认为它是

[['Chinese Super League', 'Iran Pro League', 'English Premier League']]

我需要将初始数组转换为字符串吗?

我显然在这里遗漏了一些东西,但不确定是什么

谢谢

【问题讨论】:

  • 您确定("SELECT * FROM fixtures WHERE league_name IN ($1)", [leaguesArray]) 有效吗?我的意思是 - 你确定它用查询中的那个数组替换了 $1 吗?
  • 看看下面的GitHub FAQ,我认为这正是你的问题。
  • 感谢@RamizWachtler,所有已排序,= ANY ($1)

标签: node.js postgresql


【解决方案1】:

我遇到了同样的问题,我用 pg-format 包解决了它。

对于WHERE IN,您可以这样使用它:

import format from 'pg-format';

response = await pool.query(format("SELECT * FROM fixtures WHERE league_name IN (%L)", leaguesArray));

注意:现在,pool.query 只接受一个参数,format 接受模板 + 变量来生成有效的 SQL 请求。

【讨论】:

    【解决方案2】:

    正如docs 提到的那样。我相信您使用两种方法

    方法#1

    async function getFixtures(leaguesArray) {
    let response;
      try {
        response = await pool.query("SELECT * FROM fixtures WHERE league_name = ANY ($1)", [leaguesArray]));
      } catch (e) {
        console.error('Error Occurred', e);
      }
    return response.rows;
    }
    

    方法 #2

    async function getFixtures(leaguesArray) {
    let response;
    const offset = 1;
    const placeholders = leagueArray.map(function(name,i) { 
        return '$'+(i+offset); 
    }).join(',');
      try {
        response = await pool.query("SELECT * FROM fixtures WHERE league_name IN (" + placeholders+")", leaguesArray));
      } catch (e) {
        console.error('Error Occurred', e);
      }
    return response.rows;
    }
    

    【讨论】:

    • 如果placeholders 长度为0,则方法#2 失败。获取WHERE league_name IN () 会抛出syntax error at or near ")"
    猜你喜欢
    • 2019-10-24
    • 2016-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2019-04-01
    相关资源
    最近更新 更多