这个 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 complex
OR` 逻辑)应该仍然有效:
SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND geohash >= ? AND geohash < ?;
我正在为 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 complex
OR` 逻辑)应该仍然有效:
SELECT * FROM iptools.geo2ip WHERE geo_key = ? AND geohash >= ? AND geohash < ?;