Persistencia de datos - ZODB

ZODB (Zope object Database) es una base de datos para almacenar objetos Python. Es compatible con ACID, característica que no se encuentra en las bases de datos NOSQL. El ZODB también es de código abierto, escalable horizontalmente y sin esquema, como muchas bases de datos NoSQL. Sin embargo, no se distribuye y no ofrece una fácil replicación. Proporciona un mecanismo de persistencia para los objetos de Python. Es parte del servidor de aplicaciones Zope, pero también se puede utilizar de forma independiente.

ZODB fue creado por Jim Fulton de Zope Corporation. Comenzó como un simple sistema de objetos persistentes. Su versión actual es 5.5.0 y está escrita completamente en Python. utilizando una versión extendida de la persistencia de objetos incorporada de Python (pickle).

Algunas de las características principales de ZODB son:

  • transactions
  • history/undo
  • almacenamiento enchufable de forma transparente
  • almacenamiento en caché incorporado
  • control de concurrencia multiversion (MVCC)
  • escalabilidad en una red

El ZODB es un hierarchicalbase de datos. Hay un objeto raíz, que se inicializa cuando se crea una base de datos. El objeto raíz se usa como un diccionario de Python y puede contener otros objetos (que pueden ser similares a los de un diccionario). Para almacenar un objeto en la base de datos, basta con asignarle una nueva clave dentro de su contenedor.

ZODB es útil para aplicaciones donde los datos son jerárquicos y es probable que haya más lecturas que escrituras. ZODB es una extensión del objeto pickle. Es por eso que solo se puede procesar a través de la secuencia de comandos de Python.

Para instalar la última versión de ZODB, use la utilidad pip -

pip install zodb

También se instalan las siguientes dependencias:

  • BTrees==4.6.1
  • cffi==1.13.2
  • persistent==4.5.1
  • pycparser==2.19
  • six==1.13.0
  • transaction==2.4.0

ZODB proporciona las siguientes opciones de almacenamiento:

Almacenamiento de archivos

Este es el predeterminado. Todo almacenado en un archivo big Data.fs, que es esencialmente un registro de transacciones.

Directorio de almacenamiento

Esto almacena un archivo por revisión de objeto. En este caso, no es necesario que Data.fs.index se vuelva a generar en un apagado no limpio.

RelStorage

Esto almacena encurtidos en una base de datos relacional. Se admiten PostgreSQL, MySQL y Oracle.

Para crear una base de datos ZODB necesitamos un almacenamiento, una base de datos y finalmente una conexión.

El primer paso es tener un objeto de almacenamiento.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('mydata.fs')

La clase DB utiliza este objeto de almacenamiento para obtener el objeto de la base de datos.

db = ZODB.DB(storage)

Pase None al constructor DB para crear una base de datos en memoria.

Db=ZODB.DB(None)

Finalmente, establecemos conexión con la base de datos.

conn=db.open()

El objeto de conexión le da acceso a la 'raíz' de la base de datos con el método 'root ()'. El objeto 'raíz' es el diccionario que contiene todos sus objetos persistentes.

root = conn.root()

Por ejemplo, agregamos una lista de estudiantes al objeto raíz de la siguiente manera:

root['students'] = ['Mary', 'Maya', 'Meet']

Este cambio no se guarda permanentemente en la base de datos hasta que confirmamos la transacción.

import transaction
transaction.commit()

Para almacenar el objeto de una clase definida por el usuario, la clase debe heredarse de la clase principal persistent.Persistent.

Ventajas de la subclasificación

Subclasificar la clase persistente tiene las siguientes ventajas:

  • La base de datos rastreará automáticamente los cambios de objetos realizados al establecer atributos.

  • Los datos se guardarán en su propio registro de base de datos.

  • Puede guardar datos que no sean de subclase Persistentes, pero se almacenarán en el registro de la base de datos de cualquier objeto persistente que los haga referencia. Los objetos no persistentes son propiedad de su objeto persistente que los contiene y si varios objetos persistentes se refieren al mismo subobjeto no persistente, obtendrán sus propias copias.

Use definir una clase de estudiante subclasificando la clase persistente como en -

import persistent
   class student(persistent.Persistent):
   def __init__(self, name):
      self.name = name
   def __repr__(self):
      return str(self.name)

Para agregar un objeto de esta clase, primero configuremos la conexión como se describe arriba.

import ZODB, ZODB.FileStorage
storage = ZODB.FileStorage.FileStorage('studentdata.fs')
db = ZODB.DB(storage)
conn=db.open()
root = conn.root()

Declare el objeto y agregue a la raíz y luego confirme la transacción

s1=student("Akash")
root['s1']=s1
import transaction
transaction.commit()
conn.close()

La lista de todos los objetos agregados a la raíz se puede recuperar como un objeto de vista con la ayuda del método items () ya que el objeto raíz es similar al diccionario integrado.

print (root.items())
ItemsView({'s1': Akash})

Para recuperar el atributo de un objeto específico desde la raíz,

print (root['s1'].name)
Akash

El objeto se puede actualizar fácilmente. Dado que la API de ZODB es un paquete Python puro, no requiere el uso de ningún lenguaje de tipo SQL externo.

root['s1'].name='Abhishek'
import transaction
transaction.commit()

La base de datos se actualizará instantáneamente. Tenga en cuenta que la clase de transacción también define la función abort () que es similar al control de transacciones rollback () en SQL.