Si tiene diccionarios anidados, debe tener cuidado. La mayoría de los objetos Python no se acumulan (y puedes rellenar cualquier objeto como un valor en un dict
). Peor aún, incluso menos objetos Python pueden convertirse a cadenas y almacenarse en SQL.
Sin embargo, si utiliza klepto
, la serialización y el almacenamiento en una base de datos es bastante transparente y funciona para la mayoría de los objetos de python.
Vamos a construir algunos objetos típicos de pitón en un dict
(o predice):
>>> 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}
Ahora, vamos a construir un anidado dict
, y volcado a un archivo de MySQL.
>>> import klepto
>>> a = klepto.archives.sql_archive('mysql://user:[email protected]/foo', dict={'d1':d1, 'd2':d2})
>>> a.dump()
Ahora, eliminamos nuestra interfaz del archivo ... y construimos una nueva. El load
carga todos los objetos en la memoria.
>>> del a
>>> b = klepto.archives.sql_archive('mysql://user:[email protected]/foo')
>>> b.load()
Ahora accedemos a los objetos en las copias en la memoria.
>>> 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
>>>
Salimos de python ... y luego comenzamos una nueva sesión. Esta vez, decidimos usar cached=False
, por lo que interactuaremos directamente con la base de datos.
[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
aprovecha sqlalchemy
, por lo que funciona a través de varios backends de bases de datos ... y, además, proporciona la misma dict
interfaz basada en el almacenamiento en disco (en un archivo o un directorio).
+1 Solo Python usaría 'pickle' como palabra clave ... #lulz. –
Sería serializar el objeto como JSON, no como pickle, ya que es legible para los humanos y más fácil de leer en otros lenguajes de programación. La diferencia de rendimiento no es grande. –