5

问题

我正在尝试将序列化对象(使用 cPickle)保存到 Cassandra 1.2 列中,我使用的是 python cql library。我已经尝试将列定义为文本(utf8 字符串)和 blob,在这两种情况下我都收到相同的错误:

该对象是一个 Python 字典:

obj = {'id':'sometextid',
       'time_created':05/12/2013, #<---- datetime
       'some other string property': 'some other value'
}

错误是这样的:

raise cql.ProgrammingError("Bad Request: %s" % ire.why)
cql.apivalues.ProgrammingError: Bad Request: line 31:36 no viable alternative at character '\'

查看执行的 CQL 语句,我可以在腌制对象后看到一些 '\' 字符,例如:

腌制对象的一部分

cdatetime
datetime
p4
(S'\x07\xdd\x03\x1c\x000\x13\x05\xd0<'
tRp5

我的问题

使用 cql 库序列化 python dict(包括日期时间)以将其保存到 cassandra 1.2 中的常用方法是什么?有没有更好或更直接的方法来做到这一点?

提前致谢!

4

2 回答 2

2

此问题的完整解决方案是将列定义为 blob,并以这种方式包含对十六进制的编码(如 blob 类型的 cassandra 文档中所定义):

obj_to_store = cPickle.dumps(input_obj).encode("hex")

通过这种方式,您可以序列化常规的 python dict。对于常规,我的意思是它可以包含 python dict 可以包含的任何内容,包括日期时间或您想要的任何内容,并且它将被正确序列化并存储在 cassandra 中。

也许那里有更好的解决方案,但到目前为止,这是我发现的唯一一个真正适用于任意 python dict 的解决方案。

希望它可以帮助某人!

于 2013-10-01T18:30:52.237 回答
1

听起来像是您的 CQL 库正确解析字符串的问题。在解决此问题之前,一种方法是使用struct将泡菜转换为打包字符串。

或者,您可以使用类似urllib的方式更改违规值的编码

于 2013-10-01T14:17:26.640 回答