这个 cassandra 准备好的声明调用有什么问题?

What's wrong with this cassandra prepared statement call?

我正在为 python 使用 datastax cassandra 驱动程序。

有问题的代码部分是:

cql = "SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND (( geohash >= ? AND geohash < ? ) OR ( geohash >= ? AND geohash < ? ));"
print cql
prepared = self.session.prepare(cql)

结果是:

SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND (( geohash >= ? AND geohash < ? ) OR ( geohash >= ? AND geohash < ? ));
cassandra.protocol.SyntaxException: <ErrorMessage code=2000 [Syntax error in CQL query] message="line 1:82 missing EOF at ')' (...? AND geohash < ? [)];)">

我不确定括号周围的括号从何而来,一旦我删除括号,prepare 语句就会起作用。

想法?

我很确定这是因为 CQL 不包含 OR 关键字的定义。一种替代 OR 的快捷方式是 IN:

SELECT * FROM geo2ip WHERE geo_key IN (?,?);

尽管预先警告 IN 的表现不是很好。但是,我不认为这对您有多大帮助,因为看起来您希望能够对 geohash 进行范围查询。根据您的 PRIMARY KEY 定义(例如,使用 geo_key 作为分区键和 geohash 作为集群键 ), this (minus the complexOR` 逻辑)应该仍然有效:

SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND geohash >= ? AND geohash < ?;