我们正在使用node-postgres软件包处理带有Postgres数据库的Node / Express Web应用程序。我们按照this question中的说明操作,并以这种方式编写查询:
@JsonProperty
ObjectMapper mapper = new ObjectMapper(); // create once, reuse
Clazz value = mapper.readValue(new File("resources/data.json"), Clazz.class);
是一个包含字符串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
是SQL查询,(query, args, cb)
是要传递给查询的参数数组,query
是回调用数据库结果执行的函数。
因此以这种方式编写的代码会返回正确的数据,但(我们认为)它很难看。我们尝试了将参数传递给查询的不同方法,但这是唯一成功返回数据的格式。
是否有更简洁的方式传递我们的参数? (例如,以node-postgres接受的方式传递参数的任何方式,而不必从我的数组+非数组元素创建额外的数组。)
这是因为:
答案 0 :(得分:2)
您好我试图翻译“但(我们认为)这很难看”我相信我的回答会回答您的问题。 在您引用的同一问题中,您会找到this response
用户使用特殊情况variable formatting
获取pg-promise在您的情况下,使用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它可能有助于提前查询和格式化。
答案 1 :(得分:0)
我的问题是询问是否有办法在查询之前使用node-postgres库清理我们的params
创建代码。然而,从几个已删除的答案以及剩下的答案中,似乎我们正在变得顽固,而那些额外的线条并不是那么重要,而且这是编写此代码的最佳方式。所以,我将这个问题标记为“已回答”,尽管现在看来这不是最大的问题,也许我们不应该首先问这个问题。