我在Cassandra Datastax C ++驱动程序中使用准备好的语句。如何将整数值绑定到“ USING TTL”?准备好的语句的一部分?
我的陈述将会是
INSERT INTO table (column1, column2, column3) VALUES (?, ?, ?) USING TTL ?
换句话说,如果我使用该位置绑定到TTL,它的位置是什么? (在此示例中,是4吗?)如果我使用按列名称绑定,那么它的列名称是什么?
这看起来可以在CQL中完成,但是我找不到任何有关C ++驱动程序API的文档。
答案 0 :(得分:4)
在Cassandra CQL 2.0中,您可以:
Cassandra 1.2不允许您对更新语句的TIMESTAMP和TTL属性或SELECT语句的LIMIT属性使用绑定标记。现在,此问题已解决,您可以例如准备以下语句:
SELECT * FROM myTable LIMIT ?;
UPDATE myTable USING TTL ? SET v = 2 WHERE k = 'foo';
有关详情,请参见他们的blog。
编辑:
我发现了this pdf,它告诉您更多信息:
绑定参数:
驱动程序支持两种绑定参数:按标记和按名称。 绑定参数 ?标记用于表示查询字符串中的绑定变量。这既用于常规 并准备参数化查询。除了将绑定标记添加到查询字符串之外, 您的应用程序还必须提供绑定变量的数量 构造新语句时,使用cass_statement_new()。如果查询不需要任何绑定变量,则可以使用0。 cass_statement_bind _ *() 然后使用函数将值绑定到语句的变量。 绑定变量可以通过标记索引或名称来绑定。
按标记索引绑定示例
CassString query = cass_string_init("SELECT * FROM table1 WHERE column1
= ?");
/* Create a statement with a single parameter */
CassStatement* statement = cass_statement_new(query, 1);
cass_statement_bind_string(statement, 0, cass_string_init("abc"));
/* Execute statement */
cass_statement_free(statement);
按标记名称示例绑定
对于准备好的语句,变量只能按名称绑定。存在此限制是因为查询 将变量名称映射到变量的标记索引需要Cassandra提供的元数据。
/* Prepare statement */
/* The prepared query allocates the correct number of parameters
automatically */
CassStatement* statement = cass_prepared_bind(prepared);
/* The parameter can now be bound by name */
cass_statement_bind_string_by_name(statement, "column1",
cass_string_init("abc"));
/* Execute statement */
cass_statement_free(statement);
要回答您的问题,您可以使用按索引绑定(至少可以肯定地起作用):
CassString query = cass_string_init("INSERT INTO table (column1, column2, column3) VALUES (?, ?, ?) USING TTL ?");
/* Create a statement with a single parameter */
CassStatement* statement = cass_statement_new(query, 4); // Bind 4 variables.
cass_statement_bind_string(statement, 0, cass_string_init("abc")); // Bind abc to first column.
cass_statement_bind_string(statement, 1, cass_string_init("bcd")); // Bind bcd to second column.
cass_statement_bind_string(statement, 2, cass_string_init("cde")); // Bind cde to third column.
cass_statement_bind_string(statement, 3, cass_string_init(50)); // Bind 50 to TTL.
/* Execute statement */
cass_statement_free(statement);
编辑:
请参见https://docs.datastax.com/en/cql/3.3/cql/cql_using/useExpireExample.html,其中您看到在进行INSERT的情况下,我们将TTL作为查询的最后一部分,如上所示。
答案 1 :(得分:0)
我已经尝试过Cassandra C ++驱动程序2.11。我发现了以下
TTL只能按位置绑定,我们应该使用(cass_int32_t)数据绑定TTL值
示例:cass_statement_bind_int32(statement,2,(cass_int32_t)20);
cass_statement_bind_int32_by_name无效
例如:cass_statement_bind_int32_by_name(statement 2,(cass_int32_t)20); //不起作用