Pyignite сериализации и де-сериализации сложных типов - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь сериализовать и десериализовать карту json (сложный тип карты в пиините). Сериализация, кажется, работает нормально, но я получаю ошибку в десериализации. Я не уверен, что мой сериализация верна, но он выдает массив целых чисел, который выглядит как двоичный байтовый массив.

Traceback (most recent call last):
File "ignite-sql.py", line 44, in <module>
  print([[result[0], result[1], result[2], Map.from_python(result[3])] 
  for result in results])
File "ignite-sql.py", line 44, in <listcomp>
  print([[result[0], result[1], result[2], Map.from_python(result[3])] 
  for result in results])
File "env/lib/python3.7/site-packages/pyignite/datatypes/complex.py", line 276, in from_python
  for k, v in value.items():
AttributeError: 'list' object has no attribute 'items'

Вот минимальный пример

client = Client()
client.connect('127.0.0.1', 10800)

PRESENCE_TABLE = '''
CREATE TABLE IF NOT EXISTS presence (
  subkey VARCHAR,
  channel VARCHAR,
  uuid VARCHAR,
  metadata BINARY,
  PRIMARY KEY (subkey, channel, uuid)
)'''

DROP_PRESENCE_TABLE = '''
DROP TABLE IF EXISTS presence
'''

INSERT_PRESENCE_TABLE = '''
INSERT INTO presence(
  subkey, channel, uuid, metadata
  ) VALUES (?, ?, ?, ?)
  '''


obj = Map.from_python({"foo":"bar"})
args = ["test","foo",str(uuid.uuid4()),obj]
client.sql(DROP_PRESENCE_TABLE)
client.sql(PRESENCE_TABLE)
client.sql(INSERT_PRESENCE_TABLE,query_args=args)

results = client.sql('select * from presence')

print([[result[0], result[1], result[2], Map.from_python(result[3])] for result in results])

1 Ответ

0 голосов
/ 28 января 2019

Я являюсь автором и сопровождающим pyignite .

Я постараюсь ответить на ваш вопрос, но, поскольку мне не разрешено комментировать вопросы здесь, мне придется сделатьнекоторые предположения о том, что вы пытаетесь сделать со своим кодом.

  1. Кажется, вы хотите поместить объект карты в базу данных SQL.К сожалению, Ignite не работает таким образом.Типы данных, которые использует Ignite SQL, описаны здесь .Нет карт или других сложных типов данных, как вы можете видеть.

Я не уверен, чего вы пытаетесь достичь, но, возможно, вы могли бы использовать для этой цели внешний ключ в другой таблице SQL?Это имеет больше смысла для меня, чем хранение хеш-таблицы в столбце SQL.Кроме того, вы можете JSONize ваши данные и сохранить их как String (VARCHAR).

Другое дело, как вы используете from_python() метод.Эти методы предназначены только для внутреннего использования.Они создают последовательности байтов, которые бесполезны с точки зрения пользователя.

Первой идеей pyignite API было то, что пользователь должен иметь возможность использовать только встроенные типы Python для хранения и извлечения данных в кластере Ignite.Вся сериализация находится под капотом.Нет доступных методов или объектов сериализатора. Простые примеры были написаны, чтобы дать вам эту идею.

Класс Map не имеет документов и не должен использоваться.Класс MapObject может использоваться в качестве подсказки типа в тех редких случаях, когда просто указание pyignite a dict объекта неоднозначно.Пожалуйста, прочитайте этот раздел документации о том, как использовать подсказки типов.

Говоря все это, я надеюсь, что смог указать вам правильное направление.Если нет, попробуйте уточнить ваш вопрос, и я улучшу свой ответ.

Удачи и спасибо за использование pyignite.

...