ความคงอยู่ของข้อมูล - ZODB

ZODB (Zope object Database) เป็นฐานข้อมูลสำหรับจัดเก็บวัตถุ Python เป็นไปตาม ACID - ไม่พบคุณลักษณะในฐานข้อมูล NOSQL ZODB ยังเป็นโอเพนซอร์สที่ปรับขนาดได้ในแนวนอนและไม่มีสคีมาเช่นเดียวกับฐานข้อมูล NoSQL จำนวนมาก อย่างไรก็ตามไม่มีการแจกจ่ายและไม่มีการจำลองแบบง่าย มีกลไกการคงอยู่สำหรับวัตถุ Python เป็นส่วนหนึ่งของเซิร์ฟเวอร์ Zope Application แต่ยังสามารถใช้งานได้อย่างอิสระ

ZODB ถูกสร้างขึ้นโดย Jim Fulton จาก Zope Corporation เริ่มต้นเป็นระบบวัตถุถาวรอย่างง่าย เวอร์ชันปัจจุบันคือ 5.5.0 และเขียนด้วย Python อย่างสมบูรณ์ ใช้การคงอยู่ของวัตถุในตัวของ Python (ดอง) เวอร์ชันเพิ่มเติม

คุณสมบัติหลักบางประการของ ZODB ได้แก่ -

  • transactions
  • history/undo
  • ที่เก็บข้อมูลแบบเสียบได้อย่างโปร่งใส
  • แคชในตัว
  • การควบคุมภาวะพร้อมกันหลายทาง (MVCC)
  • ความสามารถในการปรับขนาดผ่านเครือข่าย

ZODB คือไฟล์ hierarchicalฐานข้อมูล. มีอ็อบเจ็กต์รูทเริ่มต้นเมื่อสร้างฐานข้อมูล อ็อบเจ็กต์รูทถูกใช้เหมือนพจนานุกรม Python และสามารถมีอ็อบเจ็กต์อื่น ๆ (ซึ่งสามารถเป็นเหมือนพจนานุกรมได้) ในการจัดเก็บวัตถุในฐานข้อมูลก็เพียงพอที่จะกำหนดให้กับคีย์ใหม่ภายในคอนเทนเนอร์

ZODB มีประโยชน์สำหรับแอปพลิเคชันที่ข้อมูลเป็นแบบลำดับชั้นและมีแนวโน้มที่จะอ่านได้มากกว่าการเขียน ZODB เป็นส่วนขยายของวัตถุดอง นั่นเป็นเหตุผลที่สามารถประมวลผลผ่านสคริปต์ Python เท่านั้น

ในการติดตั้ง ZODB เวอร์ชันล่าสุดให้ใช้ยูทิลิตี้ pip -

pip install zodb

ยังติดตั้งการอ้างอิงต่อไปนี้ -

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

ZODB มีตัวเลือกการจัดเก็บดังต่อไปนี้ -

FileStorage

นี่คือค่าเริ่มต้น ทุกอย่างเก็บไว้ในไฟล์ Data.fs ขนาดใหญ่ซึ่งโดยพื้นฐานแล้วจะเป็นบันทึกธุรกรรม

DirectoryStorage

ซึ่งเก็บหนึ่งไฟล์ต่อการแก้ไขออบเจ็กต์ ในกรณีนี้ไม่จำเป็นต้องสร้าง Data.fs.index ขึ้นมาใหม่เมื่อปิดระบบที่ไม่สะอาด

RelStorage

นี้จัดเก็บผักดองในฐานข้อมูลเชิงสัมพันธ์ รองรับ PostgreSQL, MySQL และ Oracle

ในการสร้างฐานข้อมูล ZODB เราจำเป็นต้องมีที่เก็บข้อมูลฐานข้อมูลและสุดท้ายคือการเชื่อมต่อ

ขั้นตอนแรกคือการมีวัตถุจัดเก็บ

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

คลาส DB ใช้อ็อบเจ็กต์หน่วยเก็บข้อมูลนี้เพื่อรับอ็อบเจ็กต์ฐานข้อมูล

db = ZODB.DB(storage)

ส่งผ่าน None ไปยัง DB constructor เพื่อสร้างฐานข้อมูลในหน่วยความจำ

Db=ZODB.DB(None)

สุดท้ายเราสร้างการเชื่อมต่อกับฐานข้อมูล

conn=db.open()

จากนั้นอ็อบเจ็กต์การเชื่อมต่อจะให้คุณเข้าถึง 'root' ของฐานข้อมูลด้วยเมธอด 'root ()' วัตถุ 'root' คือพจนานุกรมที่เก็บวัตถุถาวรทั้งหมดของคุณ

root = conn.root()

ตัวอย่างเช่นเราเพิ่มรายชื่อนักเรียนไปยังวัตถุรากดังนี้ -

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

การเปลี่ยนแปลงนี้จะไม่ถูกบันทึกอย่างถาวรในฐานข้อมูลจนกว่าเราจะทำธุรกรรม

import transaction
transaction.commit()

ในการจัดเก็บอ็อบเจ็กต์ของคลาสที่ผู้ใช้กำหนดคลาสจะต้องสืบทอดจากคลาสพาเรนต์แบบถาวร

ข้อดีของ Subclassing

Subclassing คลาส Persistent มีข้อดีดังนี้ -

  • ฐานข้อมูลจะติดตามการเปลี่ยนแปลงวัตถุโดยอัตโนมัติโดยการตั้งค่าแอตทริบิวต์

  • ข้อมูลจะถูกบันทึกไว้ในบันทึกฐานข้อมูลของตัวเอง

  • คุณสามารถบันทึกข้อมูลที่ไม่ใช่คลาสย่อยถาวร แต่จะถูกเก็บไว้ในเรกคอร์ดฐานข้อมูลของสิ่งที่ออบเจ็กต์ถาวรอ้างอิง อ็อบเจ็กต์ที่ไม่ถาวรเป็นของอ็อบเจ็กต์ที่มีถาวรและหากอ็อบเจ็กต์ถาวรหลายอ็อบเจ็กต์อ้างถึงอ็อบเจ็กต์ย่อยที่ไม่ถาวรเดียวกันอ็อบเจ็กต์เหล่านั้นจะได้รับสำเนาของตัวเอง

ให้ใช้กำหนดคลาสย่อยคลาสของนักเรียนที่เป็นคลาสที่อยู่ภายใต้ -

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

ในการเพิ่มออบเจ็กต์ของคลาสนี้ให้เราตั้งค่าการเชื่อมต่อตามที่อธิบายไว้ข้างต้นก่อน

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

ประกาศอ็อบเจ็กต์เพิ่มไปยัง root จากนั้นคอมมิตธุรกรรม

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

รายการของอ็อบเจ็กต์ทั้งหมดที่เพิ่มลงในรูทสามารถเรียกดูเป็นอ็อบเจ็กต์มุมมองได้โดยใช้วิธี items () เนื่องจากอ็อบเจ็กต์รูทนั้นคล้ายกับในพจนานุกรม

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

ในการดึงแอตทริบิวต์ของวัตถุเฉพาะจากรูท

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

สามารถปรับปรุงวัตถุได้อย่างง่ายดาย เนื่องจาก ZODB API เป็นแพ็คเกจ Python แท้จึงไม่จำเป็นต้องใช้ภาษาประเภท SQL ภายนอกใด ๆ

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

ฐานข้อมูลจะได้รับการอัปเดตทันที โปรดสังเกตว่าคลาสธุรกรรมยังกำหนดฟังก์ชัน abort () ซึ่งคล้ายกับการควบคุมธุรกรรม rollback () ใน SQL