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

Node-Postgres SELECT WHERE IN dynamic query optimization

我们正在使用 node-postgres package. We followed the instructions in this question 使用 Postgres 数据库开发 Node/Express 网络应用程序,并以这种方式编写我们的查询:

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 =  AND columns.col_name IN (' + values.join(', ') + ')',
    params, cb
  );

};

data 是一个包含字符串 fileName 和列名数组 columns 的对象。 我们希望此查询从动态列数的 'columns' 和 'files' 表中提取信息。 db.query 接受参数 (query, args, cb),其中 query 是 SQL 查询,args 是传递给查询的参数数组,cb 是用数据库结果执行的回调函数。

所以这样写的代码returns数据正确,但是(我们认为)它很丑。我们尝试了将参数传递到查询的不同方式,但这是唯一成功返回数据的格式。

有没有cleaner/simpler的方式来传入我们的参数? (例如,以 node-postgres 将接受的方式传递参数的任何方式,而不必从我的数组 + 非数组元素创建一个额外的数组。)

问这个是因为:

  1. 也许有更好的方法来使用 node-postgres package/we使用不正确,
  2. 如果这是解决此类问题的正确方法,则此代码补充了上述问题的答案。

您好,我尝试翻译 "but (we think) it's ugly" 我相信我的回答回答了您的问题。 在您引用的同一个问题中,您会发现 this response

其中用户使用特殊情况的 pg-promise variable formatting

在你的情况下,它可能看起来像这样使用 shared connection but in your example I would actually recommend using a plain db.query 我只是使用共享连接向你展示我如何扩展 "ugly":

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 =  AND columns.col_name IN (^)',
    pgp.as.csv(params)));
  },function(reason){
    console.log(reason);
  })
  .done(function(){
    if(sco){
        sco.done();
        cb();
    }
  });

};

现在我再次不确定你所说的丑陋是什么意思,但在我的用例中 return 格式是这样的:

{
  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 它可能有助于高级查询和格式化。

我的问题是询问是否有一种方法可以使用 node-postgres 库,在查询之前清理我们的 params 创建代码。但是,从几个已删除的答案以及剩余的答案来看,我们似乎很生气,那些额外的几行没什么大不了的,这是编写此代码的最佳方式。所以,我标记了这个问题 "answered," 虽然现在看来这不是最重要的问题,也许我们一开始就不应该问它。