2017-09-19 24 views
0

讓我們a = "03bb2997_8b7a_4359_800d_7c14e5175bc9",我決定把它作爲我的卡桑德拉的表名。因此,通過使用Python,卡桑德拉的桌子命名規則設計不佳

session.execute("""CREATE TABLE IF NOT EXISTS "%s" (date date, time time, input text, predicted_result text, PRIMARY KEY(date, time));""" % new_modelId) 

拿筆記%S之間的雙引號的,沒有它,CQL會抱怨SyntaxException: line 1:35 mismatched character '_' expecting '-'因爲表名稱不能以成功創建該表數字字符

開始。我通過cqlsh驗證它。然而,當我嘗試將數據插入到表與下面的代碼:

session.execute("""INSERT INTO "%s" (date, time, input, predicted_result) VALUES(%s, %s, %s, %s);""", 
         (a, str(dateTime.date()), str(dateTime.time()), 
         json.dumps(json.loads(input_json)["0"]), json.dumps(json.loads(predicted_result_json)["0"]))) 

InvalidRequest: Error from server: code=2200 [Invalid query] message="unconfigured table '03bb2997_8b7a_4359_800d_7c14e5175bc9'"

我試着用硬編碼表的名稱和它的作品。

session.execute("""INSERT INTO "03bb2997_8b7a_4359_800d_7c14e5175bc9" (date, time, input, predicted_result) VALUES(%s, %s, %s, %s);""", 
         (str(dateTime.date()), str(dateTime.time()), 
         json.dumps(json.loads(input_json)["0"]), json.dumps(json.loads(predicted_result_json)["0"]))) 

我不明白卡桑德拉表命名有什麼問題。這是令人困惑和沮喪。

回答

0

您不能參數化keyspace或表名,只有參數在準備好的語句上。如何在這裏執行它並不是一個準備好的語句,但是你的執行參數與你如何放置括號相混淆。你把一個與第一個參數作爲一個元組的一部分,所以我認爲它會工作到:

session.execute("""INSERT INTO "%s" (date, time, input, predicted_result) VALUES(%s, %s, %s, %s);""", 
         a, 
         str(dateTime.date()), 
         str(dateTime.time()), 
         json.dumps(json.loads(input_json)["0"]), 
         json.dumps(json.loads(predicted_result_json)["0"]))) 

此外,您還可以隨時建立字符串自己還有:

session.execute("""INSERT INTO "%s" (date, time, input, predicted_result) VALUES('%s', '%s', '%s', '%s');""" % 
         (a, 
         str(dateTime.date()), 
         str(dateTime.time()), 
         json.dumps(json.loads(input_json)["0"]), 
         json.dumps(json.loads(predicted_result_json)["0"])))) 

總體良好練習使用硬編碼表名來確保安全。

另外,你是否動態創建表?這最終會導致問題。如果Cassandra有成千上萬的表,並且加載模式變得越來越慢(因爲您進行了更改(使用STCS)),Cassandra的表現並不理想。

+0

我嘗試使用字符串構建方法(第二次),並且出現錯誤'SyntaxException:<服務器錯誤:code = 2000 [CQL查詢中的語法錯誤] message =「行1:104不匹配的輸入'-09'期待')'(... input,predicted_result)VALUES(2017 [-09] -19 ...)「> '不過,我很欣賞那種良好習慣的提醒! –

+0

對,需要在VALUES部分的'%s'周圍放置''',具體取決於類型等 –

0

終於用醜陋的方法解決了這個問題。

query = "INSERT INTO " + a 
session.execute(query + """ (date, time, input, predicted_result) VALUES(%s, %s, %s, %s);""", (
      str(dateTime.date()), str(dateTime.time()), json.dumps(json.loads(input_json)["0"]), 
      json.dumps(json.loads(predicted_result_json)["0"])))