ความคงอยู่ของข้อมูล - 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