卡桑德拉准备了收藏品的陈述

时间:2015-08-09 14:22:58

标签: php cassandra prepared-statement cql

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

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

“属性”字段是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”,这是预处理语句中地图或列表等集合的正确语法?

2 个答案:

答案 0 :(得分:1)

首先,在php中创建一个地图或列表。然后在批处理中提供该映射或列表的对象。你可以再做一次;没有创建批处理。直接编写查询,您可以按照已经通过的方式传递。

答案 1 :(得分:1)

以防它节省了别人的时间...

我的“目标”列是集合,而不是地图-但希望,相同的原理适用于任何集合。我发现以下代码可删除批处理语句中设置的“目标”的特定元素:

$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!