Временные метки с ошибками в cqlengine (Cassandra 2.0)

Я пытаюсь выбрать столбцы временных меток из Cassandra 2.0, используя cqlengine или cql (python), и получаю неправильные результаты.

Вот что я получаю от cqlsh (или бережливость): "2013-09-23 00:00:00-0700"

Вот что я получаю от cqlengine и самого cql: "\x00\x00\x01AG\x0b\xd5\xe0"

Если вы хотите воспроизвести ошибку, попробуйте следующее:

  • открыть cqlsh
  • создать тестовую таблицу (первичный ключ имени varchar, отметка времени dt)
  • вставить в таблицу test('Test', '2013-09-23 12:00') ‹‹‹ Да, пробовал добавить другими способами....
  • выберите * из теста ( Здесь все в порядке )
  • Теперь зайдите в cqlengine или cql и выберите эту таблицу, и вы получите неверный шестнадцатеричный код.

Спасибо !


person Frank Vieira    schedule 23.09.2013    source источник
comment
Оператор вставки должен быть insert into test (name, dt) VALUES ('Test', '2013-09-23 12:00');   -  person Richard    schedule 24.09.2013


Ответы (2)


К сожалению, 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)
person Blake    schedule 24.09.2013

Тип данных 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]
person Richard    schedule 24.09.2013
comment
Я пытался несколькими способами сделать ваш пример, но все равно получаю ту же ошибку... Я не знаю, почему метка времени идет как строка, следуя вашему примеру, я получаю это -> [u'Frank', '\ x00zx00z01AL1G\x80'] Кстати: моя версия cassandra 2.0.0, спецификация CQL 3.1.0, протокол Thrift 19.37.0, cqlsh 4.0.0 - person Frank Vieira; 24.09.2013
comment
Извините, я пропустил, что вы были на Cassandra 2.0. Я получаю то же, что и вы, на Cassandra 2.0. Я подозреваю, что драйверы Python не были обновлены и по какой-то причине интерпретируют длину как строку. Я создал таблицу с полем как bigint, и оно все еще печатается как строка. Вы можете попробовать новый драйвер datastax (в бета-версии): github.com/datastax/python-driver - person Richard; 24.09.2013