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.