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 将接受的方式传递参数的任何方式,而不必从我的数组 + 非数组元素创建一个额外的数组。)
问这个是因为:
- 也许有更好的方法来使用 node-postgres package/we使用不正确,
- 如果这是解决此类问题的正确方法,则此代码补充了上述问题的答案。
您好,我尝试翻译 "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," 虽然现在看来这不是最重要的问题,也许我们一开始就不应该问它。
我们正在使用 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 将接受的方式传递参数的任何方式,而不必从我的数组 + 非数组元素创建一个额外的数组。)
问这个是因为:
- 也许有更好的方法来使用 node-postgres package/we使用不正确,
- 如果这是解决此类问题的正确方法,则此代码补充了上述问题的答案。
您好,我尝试翻译 "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," 虽然现在看来这不是最重要的问题,也许我们一开始就不应该问它。