我正在寻找在Cassandra nodejs-driver中打印结束查询的方法,即绑定所有参数后的CQL字符串,以便我可以调试并查看实际进入Cassandra引擎的值。怎么做?
var query = ' select * from shahid.tbl_raw_data where yymmddhh = ? limit ? ';
var params = [last_yymmddhh_value, settings.records_per_batch];
client.execute(query, params, {prepare: true}, function(err, result)
{
console.log( result );
});
我想得到像这样的字符串
select * from shahid.tbl_raw_data where yymmddhh = '15010101' limit 100
注意:这是一个简单的示例,我实际上是在循环中处理非常复杂的查询,因此我不想console.log(last_yymmddhh_value)
查看绑定值。
答案 0 :(得分:4)
由于评估是在服务器端完成的,因此驱动程序实际执行的查询与完整查询文本不同。
实际发送到服务器的是一个唯一ID,用于标识准备好的语句和您提供的参数值(请参阅:EXECUTE)。但是,最终您提供的查询文本是正在评估的内容。
java驱动程序有一个Query Logger concept,用于记录已执行的查询及其延迟。您可以通过仅记录慢查询或所有查询的方式对其进行配置。它还记录在预准备语句中使用的参数,即:
DEBUG [cluster1] [/127.0.0.1:9042] Query completed normally, took 9 ms: select * from shahid.tbl_raw_data where yymmddhh = ? limit ? [15010101, 100];
还没有针对nodejs-driver的这样的构造,但alex-rokabilis'答案在大多数情况下都有效,唯一的例外是您使用命名参数或实际上有'?'在列名中(这是有效的,但可能不是人们实际做的事情)。我已记录NODEJS-220请求实施此功能。
答案 1 :(得分:3)
你可以试试这个
function dispQuery(query, params) {
var params_temp = Array.from(params);
return query.replace(/\?/g, function() {
return params_temp.shift()
})
}
例如在您的代码中:
client.execute(query, params, {prepare: true}, function(err, result)
{
console.log("Query ::%s",dispQuery(query,params));
console.log("Result ::",result);
});