【问题标题】:'CREATE' in Python String causing KeyError with " 'class' "Python字符串中的'CREATE'导致带有“'class'”的KeyError
【发布时间】:2023-03-03 09:21:23
【问题描述】:

我正在尝试使用“Python-Driver”为 Cassandra(一个 NoSQL 数据库)创建一类命令。您可以使用session.execute() 在您的数据库上运行 SQL 命令。无论如何,我正在尝试创建一个函数来创建一个键空间。

代码如下:

def createKeySpace(self, title, class_type='SimpleStrategy', replication_factor='3'):
    self.session.execute("CREATE KEYSPACE {} WITH REPLICATION = \
    { 'class' : '{}', 'replication_factor' : {} };\
    ".format(title, class_type, replication_factor))

问题是,如果我尝试使用此功能,我会收到错误:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "db_commands.py", line 12, in createKeySpace
    ".format('CREATE', title, class_type, replication_factor))
KeyError: " 'class' "

我认为值得注意的一点: 我注意到我在 Sublime Text 中的字符串中的 = 符号是红色,而通常的字符串颜色是黄色。 如果我从字符串中取出“CREATE”,等号将恢复为黄色!

这是因为 Python 已经将 CREATE 识别为 SQL 语法并且不喜欢我用 .format() 声明字符串的方式吗?任何帮助都会很棒! :)

【问题讨论】:

  • 错误似乎与您的代码不匹配。
  • 你用的是什么版本的python?
  • 2.7? :P 希望它也适用于 3!

标签: python cassandra keyerror nosql


【解决方案1】:

当使用format 时,您需要转义大括号,这些大括号本来就是大括号,例如

"CREATE {} WITH REPLICATION = \
    {{ 'class' : '{}', 'replication_factor' : {}  }};".format('a','b','c')

【讨论】:

  • 啊...这很明显。我的坏..谢谢!
【解决方案2】:

您的 string.format 语法有错误 - 只是尝试按照您的方式格式化该字符串时会遇到同样的错误..

title="Title"
class_type="Class_Type"
replication_factor="Rep_Factor"

print("CREATE KEYSPACE {} WITH REPLICATION = { 'class' : '{}', 'replication_factor' : {} };".format(title, class_type, replication_factor))

Traceback (most recent call last):
File "<input>", line 3, in <module>
KeyError: " 'class' "

问题是您需要将 {} 文字加倍才能正常工作。

print("CREATE KEYSPACE {} WITH REPLICATION = \
{{ 'class' : '{}', 'replication_factor' : {} }};\
".format(title, class_type, replication_factor))

CREATE KEYSPACE Title WITH REPLICATION =     { 'class' : 'Class_Type',       'replication_factor' : Rep_Factor };  

查看How can I print literal curly-brace characters in python string and also use .format on it?了解更多详情。

【讨论】:

  • 哈哈是的。谢谢! :)
【解决方案3】:

使用这个

"CREATE KEYSPACE {} WITH REPLICATION={{ 'class' : '{}', 'replication_factor' : {}}};".format(keyspace,'SimpleStrategy',1)

您需要转义大括号,这意味着大括号是字面意思的花括号,因此请使用另外一个花括号来转义它们。

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2015-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    相关资源
    最近更新 更多