gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 23:53:46 25 4
gpt4 key购买 nike

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

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 的对象。我们希望此查询从动态列数的“列”和"file"表中提取信息。db.query(query, args, cb)为参数,其中query为SQL查询,args是传递给查询的参数数组,cb 是使用数据库结果执行的回调函数。

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

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

问这个是因为:

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

最佳答案

您好,我尝试翻译“但(我们认为)它很难看”我相信我的回答可以回答您的问题。在您引用的同一个问题中,您会发现 this response

其中用户接受带有特殊情况的 pg-promise variable formatting

在您的情况下,使用 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它可能有助于提前查询和格式化。

关于node.js - Node-Postgres SELECT WHERE IN动态查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com