我一直在使用以下模式为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组成。
timestamp字段有两个错误之一(取决于使用的绑定语句)。
当这样绑定时:
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绑定到时间戳字段时遇到这些错误吗?
(时间戳存储在cassandra中为int64 - 自纪元以来的毫秒数.cassandra.h文件表示它们被绑定为int64)
https://github.com/datastax/cpp-driver/blob/9b0c5c/include/cassandra.h (搜索时间戳)
答案 0 :(得分:2)
我需要更多信息来确定您收到此错误的原因:
日期(19)预计8或0字节长
您能分享您的代码吗?
以下错误是尝试在未准备的语句上使用“by_name”方法的结果:
群集关键部分的空值无效。
要按名称绑定值,需要通过准备语句返回元数据。参考:https://github.com/datastax/cpp-driver/blob/1.0/include/cassandra.h#L1021-L1022另外,请务必检查cass_statement_bind_int64_by_name()
的结果。
我创建了一个使用复合键和复合分区键的示例: https://gist.github.com/mpenick/ba44e24300609994ecb4
希望这有帮助。