pyignite序列化和反序列化复杂类型

时间:2019-01-24 06:05:51

标签: python ignite

我正在尝试序列化和反序列化json映射(pyignite中的Map复杂类型)。序列化似乎可以正常运行,但是反序列化时出现错误。我不确定我的序列化是否正确,但它会转储出看起来像二进制字节数组的整数数组。

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 :(得分:1)

我是pyignite的作者和维护者。

我将尝试回答您的问题,但是由于我不允许在此处对问题发表评论,因此我将不得不对您尝试对代码执行的操作进行一些猜测。

  1. 似乎您想将地图对象放入SQL数据库。不幸的是,Ignite不能这样工作。 here描述了Ignite SQL使用的数据类型。如您所见,没有地图或其他复杂的数据类型。

我不确定您要达到什么目的,但是您可能为此目的在另一个SQL表上使用外键吗?对我而言,比将哈希表存储在SQL列中更有意义。另外,您可以对数据进行JSON化并将其存储为String(VARCHAR)。

  1. 另一件事是您如何使用from_python()方法。这些方法仅供内部使用。从用户的角度来看,它们创建了无用的字节序列。

pyignite API背后的第一个想法是用户应该只能使用内置的Python类型在Ignite群集中存储和检索数据。所有序列化都在后台进行。没有可用的序列化方法或对象。 Simple examples是为了给您带来这个想法而写的。

  1. Map未记录,因此不应使用。在极少数情况下,MapObject类可以用作类型提示,而仅给pyignite一个dict对象是模棱两可的。请阅读文档的this section,了解如何使用类型提示。

说了所有这些,希望我能为您指明正确的方向。如果不是,请尝试澄清您的问题,我会改善答案。

祝您好运,并感谢您使用pyignite