如果您有嵌套的字典,您必须小心。大多数Python对象不会pickle(并且您可以将任何对象作为值塞入dict
中)。更糟糕的是,即使是更少的Python对象也无法转换为字符串并存储在SQL中。
然而,如果您使用klepto
,序列化和存储在数据库中就非常透明,并且适用于大多数Python对象。
让我们在dict
(或字典)中构建一些典型的Python对象:
>>> class Foo(object):
... def bar(self, x):
... return self.y + x
... y = 1
...
>>> d1 =
>>> f = Foo(); f.y = 100
>>> d2 =
现在,让我们构建一个嵌套的
dict
,并将其转储到MYSQL存档中。
>>> import klepto
>>> a = klepto.archives.sql_archive('mysql://user:pass@localhost/foo', dict={'d1':d1, 'd2':d2})
>>> a.dump()
现在,我们删除了与存档相关的接口...并建立了一个新的接口。 load
将所有对象加载到内存中。
>>> del a
>>> b = klepto.archives.sql_archive('mysql://user:pass@localhost/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
,以便直接与数据库交互。
dude@hilbert>$ 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:pass@localhost/foo', cached=False)
>>> b['d2']['b'](b['d2']['d'].bar(1))
1030301
>>> b['d1']['b'](b['d1']['d'].bar(1))
4
>>>
klepto
利用 sqlalchemy
,因此它可以在多个数据库后端上运行...并且还提供了相同的基于 dict
的接口,以便将数据存储在磁盘上(文件或目录中)。