Persistenza dei dati - ZODB

ZODB (Zope object Database) è un database per la memorizzazione di oggetti Python. È compatibile con ACID - caratteristica non trovata nei database NOSQL. Lo ZODB è anche open source, scalabile orizzontalmente e privo di schemi, come molti database NoSQL. Tuttavia, non è distribuito e non offre una facile replica. Fornisce un meccanismo di persistenza per gli oggetti Python. Fa parte del server Zope Application, ma può anche essere utilizzato in modo indipendente.

ZODB è stato creato da Jim Fulton di Zope Corporation. È iniziato come un semplice Persistent Object System. La sua versione attuale è 5.5.0 ed è scritta completamente in Python. utilizzando una versione estesa della persistenza degli oggetti incorporata in Python (pickle).

Alcune delle caratteristiche principali di ZODB sono:

  • transactions
  • history/undo
  • archiviazione collegabile in modo trasparente
  • memorizzazione nella cache incorporata
  • multiversion concurrency control (MVCC)
  • scalabilità su una rete

Lo ZODB è un file hierarchicalBanca dati. C'è un oggetto radice, inizializzato quando viene creato un database. L'oggetto radice viene utilizzato come un dizionario Python e può contenere altri oggetti (che possono essere a loro volta simili a un dizionario). Per memorizzare un oggetto nel database è sufficiente assegnarlo a una nuova chiave all'interno del suo contenitore.

ZODB è utile per le applicazioni in cui i dati sono gerarchici ed è probabile che ci siano più letture che scritture. ZODB è un'estensione dell'oggetto pickle. Ecco perché può essere elaborato solo tramite script Python.

Per installare l'ultima versione di ZODB, usa l'utility pip -

pip install zodb

Vengono installate anche le seguenti dipendenze:

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

ZODB fornisce le seguenti opzioni di archiviazione:

FileStorage

Questa è l'impostazione predefinita. Tutto è archiviato in un unico file Data.fs, che è essenzialmente un registro delle transazioni.

DirectoryStorage

Memorizza un file per revisione dell'oggetto. In questo caso, non richiede la ricostruzione di Data.fs.index in caso di arresto non corretto.

RelStorage

Questo memorizza i sottaceti in un database relazionale. PostgreSQL, MySQL e Oracle sono supportati.

Per creare un database ZODB abbiamo bisogno di un archivio, un database e infine una connessione.

Il primo passo è avere un oggetto di archiviazione.

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

La classe DB utilizza questo oggetto di archiviazione per ottenere l'oggetto database.

db = ZODB.DB(storage)

Passare Nessuno al costruttore di DB per creare un database in memoria.

Db=ZODB.DB(None)

Infine, stabiliamo la connessione con il database.

conn=db.open()

L'oggetto connessione ti dà quindi accesso alla 'root' del database con il metodo 'root ()'. L'oggetto "root" è il dizionario che contiene tutti gli oggetti persistenti.

root = conn.root()

Ad esempio, aggiungiamo un elenco di studenti all'oggetto radice come segue:

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

Questa modifica non viene salvata in modo permanente nel database finché non eseguiamo il commit della transazione.

import transaction
transaction.commit()

Per memorizzare l'oggetto di una classe definita dall'utente, la classe deve essere ereditata dalla classe padre persistent.Persistent.

Vantaggi della sottoclasse

Creazione di sottoclassi La classe persistente ha i suoi vantaggi come segue:

  • Il database terrà automaticamente traccia delle modifiche agli oggetti apportate impostando gli attributi.

  • I dati verranno salvati nel proprio record di database.

  • È possibile salvare dati che non sono sottoclasse Persistent, ma verranno archiviati nel record del database di qualsiasi oggetto persistente a cui fa riferimento. Gli oggetti non persistenti sono di proprietà del loro oggetto persistente contenente e se più oggetti persistenti fanno riferimento allo stesso oggetto secondario non persistente, otterranno le proprie copie.

Consenti di definire una classe di studenti sottoclasse Persistent class come sotto -

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

Per aggiungere un oggetto di questa classe, impostiamo prima la connessione come descritto sopra.

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

Dichiarare un oggetto aggiunto a root e quindi eseguire il commit della transazione

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

L'elenco di tutti gli oggetti aggiunti a root può essere recuperato come un oggetto di visualizzazione con l'aiuto del metodo items () poiché l'oggetto root è simile al dizionario integrato.

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

Per recuperare l'attributo di un oggetto specifico dalla radice,

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

L'oggetto può essere facilmente aggiornato. Poiché l'API ZODB è un pacchetto Python puro, non richiede l'utilizzo di alcun linguaggio di tipo SQL esterno.

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

Il database verrà aggiornato immediatamente. Notare che la classe di transazione definisce anche la funzione abort () che è simile al controllo delle transazioni rollback () in SQL.