0

我正在使用 CherryPy,它在从服务器上存储的文件中检索数据时似乎表现不佳。(我寻求帮助,没有人回答,所以我开始计划 B 或 C ......)现在我已经存储了一个包含一堆数据结构(3 个字典和两个列表都相关的列表)的类一个 MySQL 表,令人惊讶的是,插入二进制对象 (longblob) 比我想象的要容易。我把它变成了一个泡菜文件并插入它。

但是,我现在不知道如何重构泡菜并从中重建充满数据的类。数据库返回一个看起来像泡菜的巨大字符串,但是如何将一个字符串变成一个类似文件的对象,以便 pickle.load(data) 可以工作?

替代解决方案:如何将类保存为数据库中的 BLOB,或者关于为什么我可以保存这个类的泡菜但是当我稍后去加载它时,这个类似乎丢失了的一些想法。但是在 SSH / 本地,它可以工作 - 只有当从 cherrypy 调用 pickle.load(xxx) 时,我才会收到错误。

我准备好计划 D - 如果有更好的方法来存储结构化数据集合以便快速检索而无需泡菜或 MYSQL blob...

4

2 回答 2

0

您可以使用(c)StringIO创建类似文件的内存对象:

>>> from cStringIO import StringIO
>>> fobj = StringIO('file\ncontent')
>>> for line in fobj:
...   print line
...
file

content

但是对于泡菜的使用,您可以直接加载并转储到字符串(查看函数名称中的s ):

>>> import pickle
>>> obj = 1
>>> serialized = pickle.dumps(obj)
>>> serialized
'I1\n.'
>>> pickle.loads(serialized)
1

但是对于存储在数据库中的结构化数据,我一般建议您使用

  • 一个表,最好使用像sqlalchemy这样的 ORM,因此它直接映射到一个类
  • 一个字典,可以用JSON轻松(反)序列化

并且根本不使用泡菜。

于 2012-06-05T07:29:36.793 回答
0

我自己也为此苦苦挣扎。

使用 UTF-8 字符集转换为字节并尝试将数据加载到您的对象中。

CurrentShoppingCart.SetCartItems(pickle.loads(bytes(DBCart[0]['Cart'], 'UTF-8')))

安德鲁

于 2012-06-07T16:28:06.093 回答