让a = "03bb2997_8b7a_4359_800d_7c14e5175bc9"
和我决定把它作为我的cassandra的表名。因此,通过使用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"])))
我无法弄清楚Cassandra表命名有什么问题。这是令人困惑和令人沮丧的。
答案 0 :(得分: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"])))
答案 1 :(得分:0)
您不能参数化键空间或表名,只能参数预准备语句中的参数。你如何在这里执行它不是一个准备好的声明,但你执行的参数已经与你如何把你的括号混淆。你将第一个arg作为元组的一部分,所以我认为它会起作用:
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表现不佳。