Кассандра и PDO

Я установил драйвер YACassandraPDO для PHP. У меня есть схема, в которой одна таблица имеет поле average DOUBLE и использует CQL3/Casssandra 2.0.

И попытался сделать следующее:

$stmt = $this->connection->prepare('INSERT INTO a (average) VALUES (:average)');
$stmt->bindValue(':average', 2.2);
$stmt->execute();

Это вызывает ошибку CQLSTATE[HY000] [2] Invalid STRING constant (2.2) for average of type double.

Как я должен заставить это работать?

Видя, что PDO не имеет никакого способа указать типы float/double (docs), начинает казаться, что PDO запрещен, если только я не хочу, чтобы все мои типы полей были типа TEXT, что, в свою очередь, имеет другие нежелательные последствия.


person Kasper Middelboe Petersen    schedule 10.09.2013    source источник
comment
Если вы хотите, чтобы типы были текстовыми, измените дизайн таблицы и измените каждый столбец на text.   -  person Royal Bg    schedule 10.09.2013
comment
Попробуйте использовать кавычки вокруг :average в запросе. Это работает?   -  person hek2mgl    schedule 10.09.2013
comment
@RoyalBg Я не хочу, чтобы он сохранялся в кассандре в виде текста...   -  person Kasper Middelboe Petersen    schedule 10.09.2013
comment
@hek2mgl hek2mgl Я не уверен, чего вы пытаетесь добиться с помощью кавычек? bindValue избегает 2.2 до 2.2, что является проблемой - Cassandra не примет строку вместо двойного   -  person Kasper Middelboe Petersen    schedule 10.09.2013
comment
@KasperMiddelboePetersen Я был просто идеей. У меня нет кассандры для тестирования. Другие базы данных, такие как mysql, будут принимать '2.2' как двойное. Ты это пробовал?   -  person hek2mgl    schedule 10.09.2013


Ответы (1)


Кажется, что он ожидает строку по умолчанию, как вы уже выяснили. Согласно документации на github, и, по общему признанию, это немного нелогично, вам также нужно использовать PARAM_INT для double. Поэтому попробуйте это вместо этого:

$stmt->bindValue(':average', 2.2, PDO::PARAM_INT);
or maybe even
$stmt->bindValue(':average', "2.2", PDO::PARAM_INT);

Типы определяются следующим образом:

text        PDO::PARAM_STR 
blob        PDO::PARAM_STR 
varchar     PDO::PARAM_STR 
uuid        PDO::PARAM_INT
int         PDO::PARAM_INT
bigint      PDO::PARAM_INT
float       PDO::PARAM_INT
double      PDO::PARAM_INT
decimal     PDO::PARAM_INT

Дополнительную информацию см. в соответствующем разделе о привязке в документации драйвера на github.

Надеюсь, что это действительно работает. У меня нет работающей тестовой среды php для проверки этого.

person John    schedule 10.09.2013