2

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

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

这是我从 cqlengine 和 cql 本身得到的: "\x00\x00\x01AG\x0b\xd5\xe0"

如果你想重现错误,试试这个:

  • 打开cqlsh
  • 创建表测试(名称 varchar 主键,dt 时间戳)
  • insert into table test ('Test', '2013-09-23 12:00') <<< 是的,我尝试通过其他方式添加....
  • 从测试中选择*(这里一切都很好)
  • 现在继续 cqlengine 或 cql 本身并选择该表,您将得到一个损坏的十六进制。

谢谢 !

4

2 回答 2

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)
于 2013-09-24T22:06:59.597 回答
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]
于 2013-09-24T08:39:53.667 回答