PG-promise为选择查询创建自定义过滤器
pg-promise create custom filters for select query
我正在处理的函数是获取一个具有 7 个不同键值的输入对象,每个键值都可以未定义,也可以不定义。我想根据输入中存在的键值来过滤我的数据库。例如,如果只有input.userID
存在,我想运行此查询:
db.query("...WHERE userID = ${userID}", {userID: input.userID});
否则,如果input.userID和input.startTime都存在,我想这样做:
db.query("...WHERE userID = ${userID} and startTime= ${startTime}", {userID: input.userID, startTime: input.startTime});
我所做的是我创建了一个参数和键对象,如下所示:
if(input.userID) {
keys.push('userID');
params.push(input.userID);
query = addFilterToTheQuery(query, 'userID', input.userID, filteredItemsCount);
filteredItemsCount = filteredItemsCount +1;
}
addFilterToTheQuery
是我自己实现的简单功能。如果情况,我基本上会做 7 个。然后,我必须使用这些键和参数值以可能需要另一个巨大开关大小写代码的方式传递给查询函数。
这是唯一的方法吗?有没有更好的方法来摆脱此代码中的冗余?
自定义类型格式在这里最合适。
例如,如果我们想转换一个具有属性 - filter 值的对象,我们可以这样做:
var pgp = require('pg-promise')(/* initialization options */);
function FilterSet(filters) {
if (!filters || typeof filters !== 'object') {
throw new TypeError('Parameter ''filters'' must be an object.');
}
this._rawDBType = true; // property renamed later - see UPDATE below
this.formatDBType = function () {
var keys = Object.keys(filters);
var s = keys.map(function (k) {
return pgp.as.name(k) + ' = ${' + k + '}';
}).join(' AND ');
return pgp.as.format(s, filters);
};
}
测试
var filter = new FilterSet({
first: 1,
second: 'two'
});
var test = pgp.as.format('WHERE $1', filter);
console.log(test);
这输出:
WHERE "first" = 1 AND "second" = 'two'
如果要将筛选器用作与 LIKE
或 ILIKE
的%value%
,则需要相应地更改自定义类型。
请参阅相关问题:42, 49, 89, 90,
更新
下面是为最新的 pg-promise(版本 8.x 或更高版本)重写的相同示例:
const pgp = require('pg-promise')(/* initialization options */);
class FilterSet {
constructor(filters) {
if (!filters || typeof filters !== 'object') {
throw new TypeError('Parameter ''filters'' must be an object.');
}
this.filters = filters;
this.rawType = true; // do not escape the result from toPostgres()
}
toPostgres(/*self*/) {
// self = this
const keys = Object.keys(this.filters);
const s = keys.map(k => pgp.as.name(k) + ' = ${' + k + '}').join(' AND ');
return pgp.as.format(s, this.filters);
}
}
请参阅自定义类型格式设置。
相关文章:
- 如何在angular.js中动态应用自定义过滤器
- AngularJS自定义过滤器未触发点击事件
- Vue.js如何在定义API变量之前实现自定义过滤器
- 用于分页的 AngularJS 自定义过滤器
- 为什么我的自定义过滤器会导致无限消化
- 如何仅在文本字段中有值时才将自定义过滤器应用于 ng-repeat
- 指令中的 AngularJS 自定义过滤器以格式化值
- Angular自定义过滤器在处理某些匹配时注销,但会过滤掉所有结果
- Angular js自定义过滤器未定义
- AngularJS自定义过滤器调用了两次,并在第二次调用时删除输入数据
- 自定义过滤器的问题,我缺少什么
- 如何在Angular 1.3.6上创建一个自定义过滤器来搜索嵌套数组
- json数组angularjs中的自定义过滤器
- 两个日期之间的自定义过滤器 AngularJS
- PG-promise为选择查询创建自定义过滤器
- 角度.js. 如何计算满足自定义过滤器的 ng 重复迭代
- Angular JS“Startswith”自定义过滤器
- 无法让 Angular 自定义过滤器工作
- AngularJS自定义过滤器被调用两次
- 如何使用 Angularjs 创建自定义过滤器