如果你有嵌套字典,你必须小心。大多数python对象不会使用pickle(并且可以将任何对象填充为dict
中的值)。更糟糕的是,甚至更少的python对象可以转换为字符串并存储在SQL中。
但是,如果您使用klepto
,数据库中的序列化和存储非常透明,并且适用于大多数python对象。
让我们建立一个dict
(或类型的字典)一些典型的Python对象:
>>> class Foo(object):
... def bar(self, x):
... return self.y + x
... y = 1
...
>>> d1 = {'a': min, 'b': lambda x:x**2, 'c': [1,2,3], 'd': Foo()}
>>> f = Foo(); f.y = 100
>>> d2 = {'a': max, 'b': lambda x:x**3, 'c': [2,1,3], 'd': f}
现在,让我们构建一个嵌套dict
,并转储到MySQL存档。
>>> import klepto
>>> a = klepto.archives.sql_archive('mysql://user:[email protected]/foo', dict={'d1':d1, 'd2':d2})
>>> a.dump()
现在,我们删除我们的存档界面...并构建一个新的界面。 load
将所有对象加载到内存中。
>>> del a
>>> b = klepto.archives.sql_archive('mysql://user:[email protected]/foo')
>>> b.load()
我们现在访问内存中副本的对象。
>>> b['d1']
{'a': <built-in function min>, 'c': [1, 2, 3], 'b': <function <lambda> at 0x1037ccd70>, 'd': <__main__.Foo object at 0x103938ed0>}
>>> b['d1']['b'](b['d1']['d'].bar(1))
4
>>> b['d2']['b'](b['d2']['d'].bar(1))
1030301
>>>
我们退出python ...然后启动一个新的会话。这一次,我们决定使用cached=False
,所以我们会直接与数据库交互。
[email protected]>$ python
Python 2.7.10 (default, May 25 2015, 13:16:30)
[GCC 4.2.1 Compatible Apple LLVM 5.1 (clang-503.0.40)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import klepto
>>> b = klepto.archives.sql_archive('mysql://user:[email protected]/foo', cached=False)
>>> b['d2']['b'](b['d2']['d'].bar(1))
1030301
>>> b['d1']['b'](b['d1']['d'].bar(1))
4
>>>
klepto
利用sqlalchemy
,因此它可以在多个后端数据库......,另外,提供了相同的基于dict
接口,磁盘存储(在一个文件或目录)。
+1只有Python会使用'pickle'作为关键字... #lulz。 –
我将对象序列化为JSON,而不是pickle,因为这是人类可读的,并且更容易在其他编程语言中读取。性能差异并不大。 –