CQL PHP 驱动程序:具有良好值的准备语句上的值类型无效
CQL PHP driver: invalid value type on prepared statement with good values
我是 Cassandra 的新手。我正在使用 Datastax 的 Cassandra PHP 驱动程序。我正在尝试创建具有多个插入的批处理语句。给定 table 模型:
CREATE TABLE real_time_log (
du_id int,
tag_id int,
status int,
time_stamp bigint,
value float,
PRIMARY KEY ((du_id, tag_id), status, time_stamp)
)
我正在尝试以两种方式插入以下值:
$batch = new Cassandra\BatchStatement();
$stmt = $this->cassandraDb->prepare('insert into real_time_log'
. ' (du_id, tag_id, status, time_stamp, value) '
. 'VALUES (?, ?, ?, ?, ?)');
foreach ($curData as $cData) {
$values = explode(',', $cData);
$stmtValues = array(
'du_id' => 11111,
'tag_id' => 22222,
'status' => (int) $values[2],
'time_stamp' => new Cassandra\Bigint($values[0]),
'value' => (double) $values[1]
);
$batch->add($stmt, $stmtValues);
}
$this->cassandraDb->executeAsync($batch);
这会产生错误:
PHP Fatal error: Uncaught exception 'Cassandra\Exception\InvalidArgumentException' with message 'Invalid value type'
与此同时,我尝试了一种没有准备好的语句的更直接的方法:
$batch = new Cassandra\BatchStatement();
foreach ($curData as $cData) {
$values = explode(',', $cData);
$stmtValues = array(
11111,
22222,
(int) $values[2],
new Cassandra\Bigint($values[0]),
(double) $values[1]
);
$batch->add(new Cassandra\SimpleStatement('insert into real_time_log'
. ' (du_id, tag_id, status, time_stamp, value) '
. 'VALUES (' . implode(',', $stmtValues) . ')'));
}
$this->cassandraDb->executeAsync($batch);
这种方式一切正常,但肯定会慢很多。
也许有人可以解释我正在做的准备好的声明方法有什么问题?
提前致谢。
乍一看,它看起来应该可以工作 - 您是否尝试过显式传递一个 float
(将 (double) $values[1]
更改为 new Cassandra\Float($values[1])
)?
我已经执行了插入一行的操作,并且工作正常:
$glid = 12345;
$modid = 'mobile';
$sysdate = date("YmdHis");
$sql = "insert into user (USR_ID,modid,membersince) values (?,?,?)";
$par = array(new Cassandra\Bigint($glid),$modid,new Cassandra\Bigint($sysdate));
$statement = $db->prepare($sql);
$db->execute($statement, array(
'arguments' => $par
));
我是 Cassandra 的新手。我正在使用 Datastax 的 Cassandra PHP 驱动程序。我正在尝试创建具有多个插入的批处理语句。给定 table 模型:
CREATE TABLE real_time_log (
du_id int,
tag_id int,
status int,
time_stamp bigint,
value float,
PRIMARY KEY ((du_id, tag_id), status, time_stamp)
)
我正在尝试以两种方式插入以下值:
$batch = new Cassandra\BatchStatement();
$stmt = $this->cassandraDb->prepare('insert into real_time_log'
. ' (du_id, tag_id, status, time_stamp, value) '
. 'VALUES (?, ?, ?, ?, ?)');
foreach ($curData as $cData) {
$values = explode(',', $cData);
$stmtValues = array(
'du_id' => 11111,
'tag_id' => 22222,
'status' => (int) $values[2],
'time_stamp' => new Cassandra\Bigint($values[0]),
'value' => (double) $values[1]
);
$batch->add($stmt, $stmtValues);
}
$this->cassandraDb->executeAsync($batch);
这会产生错误:
PHP Fatal error: Uncaught exception 'Cassandra\Exception\InvalidArgumentException' with message 'Invalid value type'
与此同时,我尝试了一种没有准备好的语句的更直接的方法:
$batch = new Cassandra\BatchStatement();
foreach ($curData as $cData) {
$values = explode(',', $cData);
$stmtValues = array(
11111,
22222,
(int) $values[2],
new Cassandra\Bigint($values[0]),
(double) $values[1]
);
$batch->add(new Cassandra\SimpleStatement('insert into real_time_log'
. ' (du_id, tag_id, status, time_stamp, value) '
. 'VALUES (' . implode(',', $stmtValues) . ')'));
}
$this->cassandraDb->executeAsync($batch);
这种方式一切正常,但肯定会慢很多。 也许有人可以解释我正在做的准备好的声明方法有什么问题?
提前致谢。
乍一看,它看起来应该可以工作 - 您是否尝试过显式传递一个 float
(将 (double) $values[1]
更改为 new Cassandra\Float($values[1])
)?
我已经执行了插入一行的操作,并且工作正常:
$glid = 12345;
$modid = 'mobile';
$sysdate = date("YmdHis");
$sql = "insert into user (USR_ID,modid,membersince) values (?,?,?)";
$par = array(new Cassandra\Bigint($glid),$modid,new Cassandra\Bigint($sysdate));
$statement = $db->prepare($sql);
$db->execute($statement, array(
'arguments' => $par
));