2017-09-19 23 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"])))