如何在Cassandra nodejs-driver中打印结束查询?

时间:2016-01-23 14:38:07

标签: node.js cassandra

我正在寻找在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)查看绑定值。

2 个答案:

答案 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);
});