Persistance des données - ZODB

ZODB (Zope object Database) est une base de données pour stocker des objets Python. Il est compatible ACID - fonctionnalité introuvable dans les bases de données NOSQL. Le ZODB est également open source, évolutif horizontalement et sans schéma, comme de nombreuses bases de données NoSQL. Cependant, il n'est pas distribué et n'offre pas une réplication facile. Il fournit un mécanisme de persistance pour les objets Python. Il fait partie du serveur d'applications Zope, mais peut également être utilisé indépendamment.

ZODB a été créé par Jim Fulton de Zope Corporation. Il a commencé comme un simple système d'objets persistants. Sa version actuelle est la 5.5.0 et est entièrement écrite en Python. en utilisant une version étendue de la persistance d'objet intégrée de Python (pickle).

Certaines des principales fonctionnalités de ZODB sont:

  • transactions
  • history/undo
  • stockage enfichable de manière transparente
  • mise en cache intégrée
  • contrôle de concurrence multiversion (MVCC)
  • évolutivité sur un réseau

Le ZODB est un hierarchicalbase de données. Il existe un objet racine, initialisé lors de la création d'une base de données. L'objet racine est utilisé comme un dictionnaire Python et il peut contenir d'autres objets (qui peuvent eux-mêmes ressembler à un dictionnaire). Pour stocker un objet dans la base de données, il suffit de l'attribuer à une nouvelle clé à l'intérieur de son conteneur.

ZODB est utile pour les applications où les données sont hiérarchiques et où il y aura probablement plus de lectures que d'écritures. ZODB est une extension de l'objet pickle. C'est pourquoi il ne peut être traité que via un script Python.

Pour installer la dernière version de ZODB, utilisez l'utilitaire pip -

pip install zodb

Les dépendances suivantes sont également installées -

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

ZODB fournit les options de stockage suivantes -

FileStorage

C'est la valeur par défaut. Tout est stocké dans un seul fichier Big Data.fs, qui est essentiellement un journal de transactions.

RépertoireStorage

Cela stocke un fichier par révision d'objet. Dans ce cas, il ne nécessite pas la reconstruction de Data.fs.index lors d'un arrêt impur.

RelStorage

Cela stocke les cornichons dans une base de données relationnelle. PostgreSQL, MySQL et Oracle sont pris en charge.

Pour créer une base de données ZODB, nous avons besoin d'un stockage, d'une base de données et enfin d'une connexion.

La première étape consiste à avoir un objet de stockage.

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

La classe DB utilise cet objet de stockage pour obtenir un objet de base de données.

db = ZODB.DB(storage)

Passez None au constructeur DB pour créer une base de données en mémoire.

Db=ZODB.DB(None)

Enfin, nous établissons la connexion avec la base de données.

conn=db.open()

L'objet de connexion vous donne alors accès à la 'racine' de la base de données avec la méthode 'root ()'. L'objet «racine» est le dictionnaire qui contient tous vos objets persistants.

root = conn.root()

Par exemple, nous ajoutons une liste d'étudiants à l'objet racine comme suit -

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

Cette modification n'est pas enregistrée de manière permanente dans la base de données tant que nous ne validons pas la transaction.

import transaction
transaction.commit()

Pour stocker l'objet d'une classe définie par l'utilisateur, la classe doit être héritée de la classe parente persistent.Persistent.

Avantages du sous-classement

Sous-classer la classe persistante a ses avantages comme suit -

  • La base de données suivra automatiquement les modifications apportées aux objets en définissant des attributs.

  • Les données seront enregistrées dans son propre enregistrement de base de données.

  • Vous pouvez enregistrer des données qui ne sont pas sous-classe Persistent, mais elles seront stockées dans l'enregistrement de base de données de tout objet persistant qui y fait référence. Les objets non persistants appartiennent à leur objet persistant et si plusieurs objets persistants font référence au même sous-objet non persistant, ils obtiendront leurs propres copies.

Laissez utiliser définir une classe d'étudiant sous-classant la classe persistante comme sous -

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

Pour ajouter un objet de cette classe, commençons par configurer la connexion comme décrit ci-dessus.

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

Déclarez un objet un ajout à la racine, puis validez la transaction

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

La liste de tous les objets ajoutés à la racine peut être récupérée en tant qu'objet de vue à l'aide de la méthode items () car l'objet racine est similaire au dictionnaire intégré.

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

Pour récupérer l'attribut d'un objet spécifique à partir de la racine,

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

L'objet peut être facilement mis à jour. Étant donné que l'API ZODB est un package Python pur, elle ne nécessite aucun langage de type SQL externe pour être utilisé.

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

La base de données sera mise à jour instantanément. Notez que la classe de transaction définit également la fonction abort () qui est similaire au contrôle de transaction rollback () dans SQL.