2

cqlengine または cql(python) を使用して Cassandra 2.0 からタイムスタンプ列を選択しようとしていますが、間違った結果が得られます。

これは、cqlsh (または倹約) から取得したものです: "2013-09-23 00:00:00-0700"

これは、cqlengine と cql 自体から取得したものです: "\x00\x00\x01AG\x0b\xd5\xe0"

エラーを再現したい場合は、これを試してください:

  • cqlshを開く
  • create table test (name varchar 主キー、dt タイムスタンプ)
  • insert into table test ('Test', '2013-09-23 12:00') <<< はい、別の方法で追加しようとしました....
  • select * from test (ここではすべて問題ありません)
  • 次に、cqlengine または cql 自体に移動し、そのテーブルを選択すると、壊れた 16 進数が表示されます。

ありがとう !

4

2 に答える 2

3

残念ながら、cqlengine は現在 cassandra 2.0 と互換性がありません。

Cassandra 2.0 でいくつかの新しい型が導入されましたが、cqlengine をそれらと互換性を持たせる機会がありませんでした。また、ブロブ列の問題も認識しています。

この特定の問題は、整数ではなく生のバイト文字列としてタイムスタンプを返す 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 に答える