首页 文章

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

提问于
浏览
5

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

我的陈述是这样的

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

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

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

1 回答

  • 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了解更多信息 .

    Edit:

    我找到了this pdf,它告诉你更多:

    Bound parameters:

    驱动程序支持两种绑定参数:按标记和按名称 . 绑定参数? marker用于表示查询字符串中的绑定变量 . 这用于常规和准备参数化查询 . 除了将绑定标记添加到查询字符串之外,应用程序还必须在构造新语句时向cass_statement_new()提供绑定变量的数量 . 如果查询不需要任何绑定变量,则可以使用0 . 然后使用cass_statement_bind _ *()函数将值绑定到语句的变量 . 绑定变量可以通过标记索引或名称绑定 .

    Bind by marker index example

    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);
    

    Bind by marker name example

    变量只能通过名称绑定到预准备语句 . 存在此限制是因为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);
    

    To answer your question you can use bind by index (works at least for sure):

    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);
    

    Edit:

    请参阅https://docs.datastax.com/en/cql/3.3/cql/cql_using/useExpireExample.html,您可以看到,在INSERT的情况下,我们将USING TTL作为查询的最后一部分,如上所示 .

相关问题