2015-02-24 116 views
1

我使用python的datastax cassandra驅動程序。這個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 < ? [)];)"> 

我不知道在哪裏周圍的括號括號的來源,以及準備語句作品只要我刪除括號。

想法?

+1

我敢肯定,這是發生,因爲CQL不含OR關鍵字的定義。 – Aaron 2015-02-24 02:04:08

+0

在CQL中,它和括號在SQL中不一樣。我會一起擺脫它們。 – Aaron 2015-02-24 02:15:54

+0

你能發佈你的'CREATE TABLE geo2ip'語句嗎?這將有助於弄清楚如何得到你想要的東西。 – Aaron 2015-02-24 13:25:19

回答

1

我很確定發生這種情況,因爲CQL不包含OR關鍵字的定義。已在地方被使用的OR一個捷徑,是IN

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

雖然事先警告IN被稱爲不執行得非常好。不過,我認爲這對你無能爲力,因爲看起來你想在geohash上做一個範圍查詢。根據您的主鍵定義(例如,與geo_key作爲分區鍵,geohash的聚集鍵), this (minus the complex或`邏輯)應該仍然工作:

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