Persistensi Data - ZODB

ZODB (Zope object Database) adalah database untuk menyimpan objek Python. Ini sesuai dengan ACID - fitur tidak ditemukan di database NOSQL. ZODB juga open source, dapat diskalakan secara horizontal dan bebas skema, seperti banyak database NoSQL. Namun, itu tidak didistribusikan dan tidak menawarkan replikasi yang mudah. Ini menyediakan mekanisme persistensi untuk objek Python. Ini adalah bagian dari server Aplikasi Zope, tetapi juga dapat digunakan secara independen.

ZODB dibuat oleh Jim Fulton dari Zope Corporation. Ini dimulai sebagai Sistem Objek Persisten sederhana. Versi saat ini adalah 5.5.0 dan ditulis sepenuhnya dengan Python. menggunakan versi diperpanjang dari persistensi objek bawaan (acar) Python.

Beberapa fitur utama ZODB adalah -

  • transactions
  • history/undo
  • penyimpanan yang dapat dicolok secara transparan
  • penyimpanan internal
  • kontrol konkurensi multiversion (MVCC)
  • skalabilitas di seluruh jaringan

ZODB adalah a hierarchicaldatabase. Ada objek root, diinisialisasi saat database dibuat. Objek root digunakan seperti kamus Python dan dapat berisi objek lain (yang juga bisa seperti kamus). Untuk menyimpan objek dalam database, cukup dengan menetapkannya ke kunci baru di dalam penampungnya.

ZODB berguna untuk aplikasi yang datanya bersifat hierarkis dan kemungkinan lebih banyak dibaca daripada menulis. ZODB merupakan perpanjangan dari objek acar. Itu sebabnya hanya dapat diproses melalui skrip Python.

Untuk menginstal versi terbaru ZODB, gunakan utilitas pip -

pip install zodb

Dependensi berikut juga diinstal -

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

ZODB menyediakan opsi penyimpanan berikut -

FileStorage

Ini adalah defaultnya. Semuanya disimpan dalam satu file Data.fs besar, yang pada dasarnya adalah log transaksi.

DirectoryStorage

Ini menyimpan satu file per revisi objek. Dalam kasus ini, Data.fs.index tidak perlu dibangun kembali pada saat shutdown yang tidak bersih.

RelStorage

Ini menyimpan acar dalam database relasional. PostgreSQL, MySQL dan Oracle didukung.

Untuk membuat database ZODB kita membutuhkan penyimpanan, database, dan terakhir koneksi.

Langkah pertama adalah memiliki objek penyimpanan.

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

Kelas DB menggunakan objek penyimpanan ini untuk mendapatkan objek database.

db = ZODB.DB(storage)

Pass None ke konstruktor DB untuk membuat database dalam memori.

Db=ZODB.DB(None)

Akhirnya, kami membuat koneksi dengan database.

conn=db.open()

Objek koneksi kemudian memberi Anda akses ke 'root' database dengan metode 'root ()'. Objek 'root' adalah kamus yang menampung semua objek persisten Anda.

root = conn.root()

Misalnya, kami menambahkan daftar siswa ke objek root sebagai berikut -

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

Perubahan ini tidak disimpan secara permanen dalam database sampai kita melakukan transaksi.

import transaction
transaction.commit()

Untuk menyimpan objek dari kelas yang ditentukan pengguna, kelas tersebut harus diwarisi dari kelas induk persisten.

Keuntungan dari Subclassing

Kelas Persistent Subclassing memiliki kelebihan sebagai berikut -

  • Basis data secara otomatis akan melacak perubahan objek yang dibuat dengan mengatur atribut.

  • Data akan disimpan dalam record database-nya sendiri.

  • Anda dapat menyimpan data yang tidak mensubkelas Persistent, tetapi akan disimpan dalam rekaman database dari objek persisten apa pun yang mereferensikannya. Objek non-persisten dimiliki oleh objek persisten yang ada di dalamnya dan jika beberapa objek persisten merujuk ke sub objek non-persisten yang sama, objek tersebut akan mendapatkan salinannya sendiri.

Mari gunakan mendefinisikan kelas siswa yang membuat subkelas kelas Persisten seperti di bawah -

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

Untuk menambahkan objek kelas ini, mari kita atur dulu koneksi seperti yang dijelaskan di atas.

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

Deklarasikan objek yang ditambahkan ke root dan kemudian lakukan transaksi

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

Daftar semua objek yang ditambahkan ke root dapat diambil sebagai objek tampilan dengan bantuan metode items () karena objek root mirip dengan kamus bawaan.

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

Untuk mengambil atribut objek tertentu dari root,

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

Objek dapat dengan mudah diperbarui. Karena ZODB API adalah paket Python murni, tidak memerlukan bahasa tipe SQL eksternal untuk digunakan.

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

Basis data akan diperbarui secara instan. Perhatikan bahwa kelas transaksi juga mendefinisikan fungsi abort () yang mirip dengan kontrol transaksi rollback () di SQL.