Cassandra的表命名约定设计不佳

时间:2017-09-19 14:03:00

标签: python cassandra

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表命名有什么问题。这是令人困惑和令人沮丧的。

2 个答案:

答案 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表现不佳。