【发布时间】:2014-10-28 09:02:34
【问题描述】:
我一直在使用以下模式来构造我对 Cassandra 的插入语句(使用 datastax cpp 驱动程序):
ssStmt1 << "Insert Into some table (...) Values (....)"
string sStatement1 = ssStmt1.str();
CassString cass1 = cass_string_init(sStatement1.c_str());
CassStatement* pStmt1 = cass_statement_new(cass1, 0);
我也尝试过以下模式:
CassString cass1 = cass_string_init("Insert Into some table (id, date, c ) Values (?, ?, ?);");
CassStatement* pStmt1 = cass_statement_new(cass1, 3);
cass_statement_bind_uuid ( pStmt1, 0, uuidKey);
cass_statement_bind_int64 ( pStmt1, 1, timestamp);
cass_statement_bind_string( pStmt1, 2, sSomething);
第一种模式适用于复合键,第二种则不适用。密钥由时间戳和 uuid 组成。
时间戳字段有两个错误之一(取决于使用的绑定语句)。
当这样绑定时:
cass_statement_bind_int64_by_name ( pStmt1, "date", timestamp);
我收到以下错误:
Invalid null value for clustering key part.
以这种方式绑定时:
cass_statement_bind_int64 ( pStmt1, 1, timestamp);
我收到以下错误:
Expected 8 or 0 byte long for date (19)
上面的第一个模式将数据写入字符串流。然后将其复制到 std::string,然后再复制到 CassString,例如这是非常低效的;当使用 Cassandra 的目的是为了获得高交易率时,这不是很好。
谁能解释为什么我在尝试将 int64 绑定到时间戳字段时遇到这些错误?
(时间戳以 int64 的形式存储在 cassandra 中 - 自纪元以来的毫秒数。cassandra.h 文件说它们被绑定为 int64)
https://github.com/datastax/cpp-driver/blob/9b0c5c/include/cassandra.h (搜索时间戳)
【问题讨论】: