3

我们正在使用node-postgres包开发带有 Postgres 数据库的 Node/Express Web 应用程序。我们按照这个问题中的说明进行操作,并以这种方式编写查询:

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作为参数(query, args, cb),其中query是 SQL 查询,args是要传递给查询的参数数组,cb是与数据库结果一起执行的回调函数。

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

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

问这个是因为:

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

2 回答 2

2

您好,我试图翻译“但是(我们认为)它很丑”,我相信我的回答回答了您的问题。在您引用的同一个问题中,您会发现此回复

用户使用特殊情况变量格式接受 pg-promise

在您的情况下,使用共享连接可能看起来像这样,但在您的示例中,我实际上建议使用普通的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它可能有助于提前查询和格式化。

于 2015-07-27T07:28:48.197 回答
0

我的问题是询问是否有一种方法可以使用 node-postgres 库,以便在查询之前清理我们的params创建代码。但是,从几个已删除的答案以及剩余的答案来看,我们似乎很不耐烦,而那几行额外的代码并没有什么大不了的,这是编写此代码的最佳方式。所以,我将这个问题标记为“已回答”,尽管现在看来这不是最大的问题,也许我们一开始就不应该问这个问题。

于 2015-07-31T05:18:02.543 回答