Trwałość danych - ZODB

ZODB (Zope object Database) to baza danych do przechowywania obiektów Pythona. Jest zgodny z ACID - funkcja nie występuje w bazach danych NOSQL. ZODB jest również open source, skalowalny w poziomie i wolny od schematów, podobnie jak wiele baz danych NoSQL. Jednak nie jest rozpowszechniany i nie zapewnia łatwej replikacji. Zapewnia mechanizm trwałości dla obiektów Pythona. Jest częścią serwera Zope Application, ale może być również używany niezależnie.

ZODB został stworzony przez Jima Fultona z Zope Corporation. Zaczęło się od prostego Persistent Object System. Jego aktualna wersja to 5.5.0 i jest napisana w całości w Pythonie. używając rozszerzonej wersji wbudowanej w Pythona funkcji trwałości obiektów (pickle).

Niektóre z głównych cech ZODB to -

  • transactions
  • history/undo
  • przezroczysto podłączana pamięć
  • wbudowane buforowanie
  • kontrola współbieżności wielu wersji (MVCC)
  • skalowalność w całej sieci

ZODB to hierarchicalBaza danych. Istnieje obiekt główny, inicjowany podczas tworzenia bazy danych. Obiekt root jest używany jak słownik Pythona i może zawierać inne obiekty (które mogą być podobne do słownika). Aby przechowywać obiekt w bazie danych wystarczy przypisać go do nowego klucza wewnątrz jego kontenera.

ZODB jest przydatny w aplikacjach, w których dane są hierarchiczne i prawdopodobnie będzie więcej odczytów niż zapisów. ZODB jest rozszerzeniem obiektu marynowanego. Dlatego można go przetwarzać tylko za pomocą skryptu Python.

Aby zainstalować najnowszą wersję ZODB, użyj narzędzia pip -

pip install zodb

Następujące zależności są również instalowane -

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

ZODB zapewnia następujące opcje przechowywania -

Nośnik danych

To jest ustawienie domyślne. Wszystko jest przechowywane w jednym pliku Big Data.fs, który jest zasadniczo dziennikiem transakcji.

DirectoryStorage

To przechowuje jeden plik na wersję obiektu. W takim przypadku nie wymaga odbudowy Data.fs.index po nieczystym zamknięciu.

RelStorage

To przechowuje pikle w relacyjnej bazie danych. Obsługiwane są PostgreSQL, MySQL i Oracle.

Do stworzenia bazy danych ZODB potrzebujemy magazynu, bazy danych i wreszcie połączenia.

Pierwszym krokiem jest posiadanie obiektu pamięci.

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

Klasa DB używa tego obiektu pamięci do uzyskania obiektu bazy danych.

db = ZODB.DB(storage)

Przekaż None do konstruktora DB, aby utworzyć bazę danych w pamięci.

Db=ZODB.DB(None)

Wreszcie nawiązujemy połączenie z bazą danych.

conn=db.open()

Obiekt połączenia zapewnia następnie dostęp do „katalogu głównego” bazy danych za pomocą metody „root ()”. Obiekt „root” to słownik, który zawiera wszystkie trwałe obiekty.

root = conn.root()

Na przykład dodajemy listę uczniów do obiektu głównego w następujący sposób -

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

Ta zmiana nie jest trwale zapisywana w bazie danych, dopóki nie zatwierdzimy transakcji.

import transaction
transaction.commit()

Aby przechowywać obiekt klasy zdefiniowanej przez użytkownika, klasa ta musi być dziedziczona z trwałej klasy nadrzędnej.

Zalety podklasy

Podklasa Trwała klasa ma następujące zalety -

  • Baza danych będzie automatycznie śledzić zmiany obiektów wprowadzone przez ustawienie atrybutów.

  • Dane zostaną zapisane we własnym rekordzie bazy danych.

  • Możesz zapisać dane, które nie są podklasą Trwałe, ale będą przechowywane w rekordzie bazy danych dowolnego trwałego obiektu, do którego się odwołuje. Obiekty nietrwałe są własnością ich trwałego obiektu zawierającego i jeśli wiele trwałych obiektów odwołuje się do tego samego nietrwałego podobiektu, otrzymają one własne kopie.

Użyjmy zdefiniuj podklasę klasy studenta Trwałą klasę jako poniżej -

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

Aby dodać obiekt tej klasy, najpierw skonfigurujmy połączenie zgodnie z powyższym opisem.

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

Zadeklaruj obiekt jako add do roota, a następnie zatwierdź transakcję

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

Listę wszystkich obiektów dodanych do roota można pobrać jako obiekt widoku za pomocą metody items (), ponieważ obiekt root jest podobny do wbudowanego słownika.

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

Aby pobrać atrybut określonego obiektu z katalogu głównego,

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

Obiekt można łatwo zaktualizować. Ponieważ API ZODB jest czystym pakietem Pythona, nie wymaga używania żadnego zewnętrznego języka typu SQL.

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

Baza danych zostanie natychmiast zaktualizowana. Należy zauważyć, że klasa transakcji definiuje również funkcję abort (), która jest podobna do kontroli transakcji rollback () w SQL.