【问题标题】:Bugged timestamps on cqlengine (Cassandra 2.0)cqlengine 上的错误时间戳(Cassandra 2.0)
【发布时间】:2013-09-28 21:38:24
【问题描述】:

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

这是我从 cqlsh (或 thrift )得到的: "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')
  • select * from test(这里一切正常)
  • 现在继续 cqlengine 或 cql 本身并选择该表,您将得到一个损坏的十六进制。

谢谢!

【问题讨论】:

  • 插入语句应该是insert into test (name, dt) VALUES ('Test', '2013-09-23 12:00');

标签: python timestamp cassandra cql3


【解决方案1】:

很遗憾,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)

【讨论】:

    【解决方案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]
    

    【讨论】:

    • 我尝试了几种方法来做你的例子,但我仍然得到同样的错误......我不知道为什么时间戳像一个字符串一样,按照你的例子我明白了 -> [u'Frank', '\x00zx00z01AL1G\x80'] 顺便说一句:我的 cassandra 版本是 2.0.0,CQL 规范 3.1.0,Thrift 协议 19.37.0,cqlsh 4.0.0
    • 对不起,我错过了你在 Cassandra 2.0 上。我在 Cassandra 2.0 上得到的和你一样。我怀疑 python 驱动程序尚未更新,并且由于某种原因正在将 long 解释为字符串。我创建了一个字段为 bigint 的表,它仍然打印为字符串。您可以尝试新的 datastax 驱动程序(测试版):github.com/datastax/python-driver
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    • 1970-01-01
    • 1970-01-01
    • 2017-04-02
    • 2016-07-11
    相关资源
    最近更新 更多