Node-Postgres SELECT WHERE IN动态查询优化

时间:2015-07-22 14:36:21

标签: node.js postgresql node-postgres

我们正在使用node-postgres软件包处理带有Postgres数据库的Node / Express Web应用程序。我们按照this question中的说明操作,并以这种方式编写查询:

@JsonProperty

ObjectMapper mapper = new ObjectMapper(); // create once, reuse Clazz value = mapper.readValue(new File("resources/data.json"), Clazz.class); 是一个包含字符串exports.getByFileNameAndColName = function query(data, cb) { const values = data.columns.map(function map(item, index) { return '$' + (index + 2); }); const params = []; params.push(data.fileName); data.columns.forEach(function iterate(element) { params.push(element); }); db.query('SELECT * FROM columns ' + 'INNER JOIN files ON columns.files_id = files.fid ' + 'WHERE files.file_name = $1 AND columns.col_name IN (' + values.join(', ') + ')', params, cb ); }; 和列名data数组的对象。 我们希望此查询从动态数量的列中提取“列”和“文件”表中的信息。 fileName作为参数columns,其中db.query是SQL查询,(query, args, cb)是要传递给查询的参数数组,query是回调用数据库结果执行的函数。

因此以这种方式编写的代码会返回正确的数据,但(我们认为)它很难看。我们尝试了将参数传递给查询的不同方法,但这是唯一成功返回数据的格式。

是否有更简洁的方式传递我们的参数? (例如,以node-postgres接受的方式传递参数的任何方式,而不必从我的数组+非数组元素创建额外的数组。)

这是因为:

  1. 也许有更好的方法来使用node-postgres包/我们错误地使用它,
  2. 如果这是解决此类问题的正确方法,那么此代码补充了上述问题中的答案。

2 个答案:

答案 0 :(得分:2)

您好我试图翻译“但(我们认为)这很难看”我相信我的回答会回答您的问题。 在您引用的同一问题中,您会找到this response

用户使用特殊情况variable formatting

获取pg-promise

在您的情况下,使用shared connection可能看起来像这样,但在您的示例中我实际上建议使用普通db.query我只是使用共享连接向您展示我如何扩展“丑陋” :

exports.getByFileNameAndColName = function query(data,cb) {
  var sco; 
  const params = [];
  params.push(data.fileName);
  data.columns.forEach(function iterate(element) {
    params.push(element);
  });
  db.connect()
  .then(function(obj){
    sco=obj;
    return sco.query('SELECT * FROM columns ' +
      'INNER JOIN files ON columns.files_id = files.fid ' +
      'WHERE files.file_name = $1 AND columns.col_name IN ($2^)',
    pgp.as.csv(params)));
  },function(reason){
    console.log(reason);
  })
  .done(function(){
    if(sco){
        sco.done();
        cb();
    }
  });

};

现在我再次确定你的丑陋意味着什么,但在我的用例中,返回格式是这样的:

{
  column:[
         {
          id: data,
          data: data,
          col_name: data,
          files_id: data,
          fid: data,
          files_name: data
         },...
   ]
}

就我而言,我真的很想要这个:

{
      column:[
              {
              id: data,
              data: data,
              col_name: data,
              files_id: data,
              },...
      ],
      file:[
            {
             fid: data,
             files_name: data
            },...
      ]

    }

所以为了做到这一点,我采用了相同的共享连接并添加了一个额外的变量来管理结果。现在这可能无法解答您的问题,或者我可能会接触到某些内容,但我建议您查看pg-promises它可能有助于提前查询和格式化。

答案 1 :(得分:0)

我的问题是询问是否有办法在查询之前使用node-postgres库清理我们的params创建代码。然而,从几个已删除的答案以及剩下的答案中,似乎我们正在变得顽固,而那些额外的线条并不是那么重要,而且这是编写此代码的最佳方式。所以,我将这个问题标记为“已回答”,尽管现在看来这不是最大的问题,也许我们不应该首先问这个问题。