Persistência de dados - ZODB

ZODB (Zope object Database) é um banco de dados para armazenar objetos Python. É compatível com ACID - recurso não encontrado em bancos de dados NOSQL. O ZODB também é open source, horizontalmente escalável e sem esquemas, como muitos bancos de dados NoSQL. No entanto, não é distribuído e não oferece replicação fácil. Ele fornece mecanismo de persistência para objetos Python. É uma parte do servidor Zope Application, mas também pode ser usado independentemente.

O ZODB foi criado por Jim Fulton da Zope Corporation. Tudo começou como um sistema de objeto persistente simples. Sua versão atual é 5.5.0 e foi escrita totalmente em Python. usando uma versão estendida da persistência de objeto embutida do Python (pickle).

Algumas das principais características do ZODB são -

  • transactions
  • history/undo
  • armazenamento conectável de forma transparente
  • cache embutido
  • controle de simultaneidade multiversão (MVCC)
  • escalabilidade em uma rede

O ZODB é um hierarchicalbase de dados. Existe um objeto raiz, inicializado quando um banco de dados é criado. O objeto raiz é usado como um dicionário Python e pode conter outros objetos (que podem ser semelhantes a um dicionário). Para armazenar um objeto no banco de dados, basta atribuí-lo a uma nova chave dentro de seu container.

O ZODB é útil para aplicativos em que os dados são hierárquicos e é provável que haja mais leituras do que gravações. ZODB é uma extensão do objeto pickle. É por isso que ele pode ser processado apenas por meio de script Python.

Para instalar a versão mais recente do ZODB, vamos usar o utilitário pip -

pip install zodb

As seguintes dependências também são instaladas -

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

ZODB oferece as seguintes opções de armazenamento -

Armazenamento de arquivo

Este é o padrão. Tudo armazenado em um grande arquivo Data.fs, que é essencialmente um log de transações.

DirectoryStorage

Isso armazena um arquivo por revisão de objeto. Nesse caso, ele não exige que o Data.fs.index seja reconstruído em um desligamento não limpo.

RelStorage

Isso armazena picles em um banco de dados relacional. PostgreSQL, MySQL e Oracle são suportados.

Para criar o banco de dados ZODB, precisamos de um armazenamento, um banco de dados e, finalmente, uma conexão.

O primeiro passo é ter um objeto de armazenamento.

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

A classe DB usa este objeto de armazenamento para obter o objeto de banco de dados.

db = ZODB.DB(storage)

Passe nenhum para o construtor de banco de dados para criar o banco de dados na memória.

Db=ZODB.DB(None)

Finalmente, estabelecemos conexão com o banco de dados.

conn=db.open()

O objeto de conexão então fornece acesso à 'raiz' do banco de dados com o método 'root ()'. O objeto 'raiz' é o dicionário que contém todos os seus objetos persistentes.

root = conn.root()

Por exemplo, adicionamos uma lista de alunos ao objeto raiz da seguinte forma -

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

Esta alteração não é salva permanentemente no banco de dados até que confirmemos a transação.

import transaction
transaction.commit()

Para armazenar o objeto de uma classe definida pelo usuário, a classe deve ser herdada da classe pai persistent.Persistent.

Vantagens da subclasse

A subclasse da classe Persistent tem as seguintes vantagens -

  • O banco de dados rastreará automaticamente as alterações de objeto feitas pela configuração de atributos.

  • Os dados serão salvos em seu próprio registro de banco de dados.

  • Você pode salvar dados que não tenham a subclasse de Persistente, mas serão armazenados no registro do banco de dados de qualquer objeto persistente que faça referência a ele. Objetos não persistentes são propriedade de seu objeto persistente que os contém e se vários objetos persistentes se referirem ao mesmo subobjeto não persistente, eles obterão suas próprias cópias.

Vamos definir uma classe de aluno com subclasse de classe Persistente como em -

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

Para adicionar um objeto desta classe, vamos primeiro configurar a conexão conforme descrito acima.

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

Declara o objeto e adiciona à raiz e, em seguida, confirma a transação

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

A lista de todos os objetos adicionados à raiz pode ser recuperada como um objeto de visualização com a ajuda do método items (), uma vez que o objeto raiz é semelhante ao construído no dicionário.

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

Para buscar o atributo de um objeto específico da raiz,

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

O objeto pode ser facilmente atualizado. Uma vez que a API ZODB é um pacote Python puro, não requer o uso de nenhuma linguagem de tipo SQL externa.

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

O banco de dados será atualizado instantaneamente. Observe que a classe de transação também define a função abort () que é semelhante ao controle de transação rollback () em SQL.