cqlengine上的错误时间戳(Cassandra 2.0)

时间:2013-09-23 20:50:55

标签: python timestamp cassandra cql3

我正在尝试使用cqlengine或cql(python)从Cassandra 2.0中选择时间戳列,并且我得到了错误的结果。

这是我从cqlsh(或thrift)得到的: “2013-09-23 00:00:00-0700”

这是我从cqlengine和cql本身得到的: “\ X00 \ X00 \ x01AG \ X0B \ XD5 \ xe0”

如果您想重现错误,请尝试以下操作:

  • 打开cqlsh
  • create table test(name varchar primary key,dt timestamp)
  • 插入表格测试('Test','2013-09-23 12:00')<<<是的,我试图通过另一种方式添加....
  • 从测试中选择*(这里一切都很好)
  • 现在继续cqlengine或cql本身并选择该表,你会得到一个破碎的十六进制。

谢谢!

2 个答案:

答案 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]