如何在INSERT,Cassandra C ++驱动程序中将值绑定到TTL

时间:2018-06-22 20:25:11

标签: c++ cassandra

我在Cassandra Datastax C ++驱动程序中使用准备好的语句。如何将整数值绑定到“ USING TTL”?准备好的语句的一部分?

我的陈述将会是

INSERT INTO table (column1, column2, column3)  VALUES (?, ?, ?) USING TTL ?

换句话说,如果我使用该位置绑定到TTL,它的位置是什么? (在此示例中,是4吗?)如果我使用按列名称绑定,那么它的列名称是什么?

这看起来可以在CQL中完成,但是我找不到任何有关C ++驱动程序API的文档。

2 个答案:

答案 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。我发现了以下

  1. TTL只能按位置绑定,我们应该使用(cass_int32_t)数据绑定TTL值

    示例:cass_statement_bind_int32(statement,2,(cass_int32_t)20);

  2. cass_statement_bind_int32_by_name无效

    例如:cass_statement_bind_int32_by_name(statement 2,(cass_int32_t)20); //不起作用