Node.js 节点Postgres选择动态查询优化中的位置

Node.js 节点Postgres选择动态查询优化中的位置,node.js,postgresql,node-postgres,Node.js,Postgresql,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

我们正在使用该软件包开发一个带有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
  );

};
数据
是一个包含字符串
文件名
和列名数组
的对象。 我们希望此查询从动态列数的“columns”和“files”表中提取信息。
db.query
作为参数
(query,args,cb)
,其中
query
是SQL查询,
args
是传递到查询中的参数数组,
cb
是使用数据库结果执行的回调函数

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

是否有更干净/更简单的方法来传递参数?(例如,以节点postgres将接受的方式传递参数的任何方式,而无需从我的数组+非数组元素创建额外数组。)

问这个问题是因为:

  • 也许有更好的方法来使用node postgres包/我们不正确地使用了它
  • 如果这是解决此类问题的正确方法,则此代码将补充上述问题的答案

  • 你好,我试着翻译“但是(我们认为)它很难看”,我相信我的回答回答了你的问题。 在你提到的同一个问题中,你会发现

    用户在特殊情况下接受pg承诺

    在你的例子中,它可能看起来像这样,但在你的例子中,我实际上建议使用一个简单的Im,只是使用共享连接来向你展示我如何扩展“丑陋”:

    现在我也不知道你说的丑陋是什么意思,但在我的用例中,返回格式是这样的:

    {
      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
                },...
          ]
    
        }
    

    因此,为了做到这一点,我采用了相同的共享连接,并添加了一个额外的变量来管理结果。现在,这可能无法回答您的问题,或者我只是想了解一些事情,但我建议深入研究它可能有助于高级查询和格式设置。

    我的问题是,是否有一种方法可以在查询之前以清理
    参数的方式使用node postgres库。然而,从几个被删除的答案以及剩下的一个来看,我们似乎是在装腔作势,这几行额外的代码并没有什么大不了的,这是编写这段代码的最佳方式。因此,我将这个问题标记为“已回答”,尽管现在看来这不是最重要的问题,也许我们不应该首先问它。

    允许($2^)中使用
    的变量格式是有趣的。它确实稍微清理了一下查询,但是在
    pgp.as.csv
    实际做的事情周围增加了一些模糊性。在这种情况下,我认为我的原始代码的意图更加清晰。实际上,我们对数据的输出方式也很在行——它被传递到我们的
    cb
    回调函数,并在其他地方进行处理。@eugene1832,
    pgp.as.csv
    获取一个值数组,并将其转换为一个格式正确的逗号分隔的值列表,这些值可以传递到函数或
    WHERE IN(…)
    与本例类似。@artsmc,在您提供的示例中,使用共享连接是毫无意义的,它只会不必要地使示例复杂化。常规的
    db.query
    可以很好地完成这项工作。@vitaly-t我还提到了常规的db.query可以很好地完成这项工作。我个人使用共享连接扩展了一些功能,但我没有提供一个示例,也许可以为您澄清这一问题。如果没有,您可以随时在上问一个问题。让我澄清一下:我的意思是,仅使用pg promise进行变量格式设置会删除以前的3行代码,但我已经将3行清晰编写的代码替换为整个库的内容,只为这一个功能。这就是我的意思,当我说原始代码的意图比使用pgpromise提供的示例更清晰时。遵循这样的原则,在本例中,我不认为使用pg promise库是更好的解决方案。也许,但您可以获得更高级别的一致性抽象,这将使您在其他任何地方受益;)除此之外,
    WHERE IN
    只是一种特殊情况,在这种情况下必须调整标准参数格式,这样就不会影响代码的清洁度(
    {
          column:[
                  {
                  id: data,
                  data: data,
                  col_name: data,
                  files_id: data,
                  },...
          ],
          file:[
                {
                 fid: data,
                 files_name: data
                },...
          ]
    
        }