Cassandra 使用集合准备语句

Cassandra prepared statements with collections

我已经开始使用 DataStax PHP 驱动程序在 PHP 中学习 Cassandra,我必须使用准备好的语句在 CQL 中设置映射的值,查询是:

INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);

"attributes" 字段是 MAP 类型,因此我尝试将其作为字符串传递:

{'address':'address...','phone':'phone...'}

在PHP中:

$attr = "{'address':'address...','phone':'phone...'}";
$statement = $session->prepare("INSERT INTO users (name, attributes, mail, password) VALUES (?, ?, ?, ?);");
$session->execute($statement, new Cassandra\ExecutionOptions(array('arguments' => array($name, $attr, $mail, $password))));

但我收到错误 "java.lang.IllegalArgumentException",这是准备好的语句中映射或列表等集合的正确语法吗?

首先,在php中创建地图或列表。然后在批处理语句中提供该映射或列表的对象。你可以再做一个;无需创建批处理语句。直接写查询,已经pass了就pass了。

万一它能帮别人节省一些时间...

我的 'targets' 专栏是一个集合,而不是地图 - 但希望同样的原则适用于任何集合。我发现下面的代码可以删除批处理语句中 'targets' 集合的特定元素:

$batch = new Cassandra\BatchStatement(Cassandra::BATCH_LOGGED);
$deleteTargetStmt = "DELETE targets[?] FROM $this->keyspace.user WHERE userid=?";
$targetPrepStmt = $this->session->prepare($deleteTargetStmt);
$batch->add($targetPrepStmt, array(new Cassandra\Timeuuid($targetId), new Cassandra\Uuid($userId)));
... other batch statement ommitted ...
$this->session->execute($batch);

事实上,这实际上与非准备语句的语法相同。但是我花了很长时间才发现我必须在 add 的参数上调用新的 Timeuuid 和 Uuid!