我正在尝试使用cqlengine或cql(python)从Cassandra 2.0中选择时间戳列,并且我得到了错误的结果。
这是我从cqlsh(或thrift)得到的: “2013-09-23 00:00:00-0700”
这是我从cqlengine和cql本身得到的: “\ X00 \ X00 \ x01AG \ X0B \ XD5 \ xe0”
如果您想重现错误,请尝试以下操作:
谢谢!
答案 0 :(得分:3)
不幸的是,cqlengine目前不兼容cassandra 2.0
Cassandra 2.0引入了一些新类型,我们还没有机会让cqlengine与它们兼容。我也知道blob列有问题。
这个特殊问题是由cql驱动程序返回时间戳作为原始字节字符串而不是整数引起的。
由于cqlengine还不支持Cassandra 2.0,你最好的选择是使用Cassandra 1.2.x直到我们能够更新它,cqlengine不支持任何新的2.0功能。如果你真的需要使用2.0,你可以通过继承DateTime列来解决这个问题,如下所示:
class NewDateTime(DateTime):
def to_python(self, val):
if isinstance(val, basestring):
val = struct.unpack('!Q', val)[0] / 1000.0
return super(NewDateTime, self).to_python(val)
答案 1 :(得分:2)
timestamp
数据类型将值存储为自纪元以来的毫秒数(以long为单位)。看来,无论你是打印它还是将它解释为一个字符串。在创建和插入问题之后,这对我使用cql-dbapi2起作用:
>>> import cql
>>> con = cql.connect('localhost', keyspace='ks', cql_version='3.0.0')
>>> cursor = con.cursor()
>>> cursor.execute('select * from test;')
True
>>> cursor.fetchone()
[u'Test', 1379934000.0]