Кассандра подготовила заявления с коллекциями

Я начал изучать Cassandra на PHP, используя драйвер PHP DataStax, и мне нужно установить значение карты в 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», который является правильным синтаксисом для коллекций, таких как карты или списки в подготовленных выражениях?

1

Решение

Сначала создайте карту или список в php. Затем укажите объект этой карты или списка в пакетном режиме. Вы можете сделать еще один; без создания пакетного отчета. Пишите запросы напрямую, и вы можете проходить так, как уже прошли.

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

Фактически, это фактически тот же синтаксис, что и для неподготовленного оператора. Но мне потребовались целые годы, чтобы узнать, что мне пришлось вызывать новые Timeuuid и Uuid по аргументам add!

1

По вопросам рекламы [email protected]