截获knex.js的查询预执行
我正在为将knex.js用于所有与SQL相关的东西的应用程序制定缓存策略。有没有一种方法可以拦截查询,以检查是否可以从缓存中获取查询而不是查询数据库?
简要研究了具有查询事件的knex.js事件。文件:查询事件将在查询发生之前立即触发,提供有关查询的数据,包括连接的__knexUid / __knexTxId属性以及toSQL中描述的有关查询的任何其他信息。对于记录整个应用程序中的所有查询很有用。
这意味着可以执行类似的操作(同样来自文档)
.from('users')
.on('query', function(data) {
app.log(data);
})
.then(function() {
// ...
});
但是在实际执行对数据库的查询之前,可以使on查询方法拦截并做一些逻辑吗?
回答如下:[我注意到此建议附加在Knex GitHub issue上(归功于Arian Santrach),似乎很相关:
knex.QueryBuilder.extend('cache', async function () {
try {
const cacheKey = this.toString()
if(cache[cacheKey]) {
return cache[cacheKey]
}
const data = await this
cache[cacheKey] = data
return data
} catch (e) {
throw new Error(e)
}
});
这将允许:
knex('tablename').where(criteria).cache()
检查同一查询的缓存数据。我认为,无论哪种缓存解决方案,都可以使用类似的结构,以查询的字符串表示形式为键。
截获knex.js的查询预执行
我正在为将knex.js用于所有与SQL相关的东西的应用程序制定缓存策略。有没有一种方法可以拦截查询,以检查是否可以从缓存中获取查询而不是查询数据库?
简要研究了具有查询事件的knex.js事件。文件:查询事件将在查询发生之前立即触发,提供有关查询的数据,包括连接的__knexUid / __knexTxId属性以及toSQL中描述的有关查询的任何其他信息。对于记录整个应用程序中的所有查询很有用。
这意味着可以执行类似的操作(同样来自文档)
.from('users')
.on('query', function(data) {
app.log(data);
})
.then(function() {
// ...
});
但是在实际执行对数据库的查询之前,可以使on查询方法拦截并做一些逻辑吗?
回答如下:[我注意到此建议附加在Knex GitHub issue上(归功于Arian Santrach),似乎很相关:
knex.QueryBuilder.extend('cache', async function () {
try {
const cacheKey = this.toString()
if(cache[cacheKey]) {
return cache[cacheKey]
}
const data = await this
cache[cacheKey] = data
return data
} catch (e) {
throw new Error(e)
}
});
这将允许:
knex('tablename').where(criteria).cache()
检查同一查询的缓存数据。我认为,无论哪种缓存解决方案,都可以使用类似的结构,以查询的字符串表示形式为键。