在python中重构一个充满MySQL BLOB对象数据的类

时间:2012-06-04 22:52:51

标签: python mysql class blob cherrypy

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

然而,我无法弄清楚如何重建泡菜并重建现在充满数据的类。数据库返回一个看起来像pickle的巨型字符串,但是如何将字符串转换为类似文件的对象,以便pickle.load(data)可以工作?

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

我想要计划D - 如果有更好的方法来存储结构化数据的集合,以便在没有泡菜或MYSQL blob的情况下快速检索...

2 个答案:

答案 0 :(得分:0)

您可以使用(c)StringIO

创建类似文件的内存中对象
>>> from cStringIO import StringIO
>>> fobj = StringIO('file\ncontent')
>>> for line in fobj:
...   print line
...
file

content

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

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

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

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

根本没有使用泡菜。

答案 1 :(得分:0)

我自己也在努力。

使用UTF-8字符集转换为字节,并尝试在对象中加载数据。

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

安德鲁