【问题标题】:How to bind a value to TTL in INSERT, Cassandra C++ driver如何在 INSERT、Cassandra C++ 驱动程序中将值绑定到 TTL
【发布时间】:2020-09-16 02:13:20
【问题描述】:

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

我的陈述会是这样的

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

也就是说,如果我使用位置绑定到 TTL,它的位置是什么? (在这个例子中,是 4 吗?)如果我使用按列名绑定,它的列名是什么?

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

【问题讨论】:

  • 2 否决票...这个问题有什么问题?我错过了什么?我是真诚地问。

标签: c++ cassandra


【解决方案1】:

在 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 作为查询的最后一部分,如上所示。

【讨论】:

  • 谢谢,虽然那篇博文太简短了。后面有一篇博文提到了client-side driver improvements,但并没有说明如何绑定到LIMIT或TTL,而且显然也排除了C++驱动。所以这个答案只是解决方案的一半。问题仍然存在:如何将值绑定到 C++ 驱动程序中的 LIMIT 和 TTL 标记?
【解决方案2】:

我已经尝试过 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); //不起作用

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 2018-04-08
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2018-05-13
    相关资源
    最近更新 更多