資料持久化 - ZODB



ZODB (**Zope 物件資料庫**) 是用於儲存 Python 物件的資料庫。它符合 ACID 規範 - 這是 NoSQL 資料庫中沒有的功能。ZODB 也是開源的、水平可擴充套件的和無模式的,就像許多 NoSQL 資料庫一樣。但是,它不是分散式的,也不提供簡單的複製功能。它為 Python 物件提供了持久化機制。它是 Zope 應用程式伺服器的一部分,但也可以獨立使用。

ZODB 由 Zope 公司的 Jim Fulton 建立。它最初是一個簡單的持久化物件系統。其當前版本為 5.5.0,完全用 Python 編寫,使用 Python 內建物件持久化 (pickle) 的擴充套件版本。

ZODB 的一些主要功能包括:

  • 事務
  • 歷史記錄/撤銷
  • 可插拔儲存
  • 內建快取
  • 多版本併發控制 (MVCC)
  • 網路可擴充套件性

ZODB 是一個**分層**資料庫。在建立資料庫時會初始化一個根物件。根物件像 Python 字典一樣使用,並且可以包含其他物件(這些物件本身可以像字典一樣)。要將物件儲存到資料庫中,只需將其分配到其容器內的新的鍵即可。

ZODB 適用於資料具有層次結構並且讀取操作多於寫入操作的應用程式。ZODB 是 pickle 物件的擴充套件。因此,它只能透過 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

此選項將 pickle 儲存在關係資料庫中。支援 PostgreSQL、MySQL 和 Oracle。

要建立 ZODB 資料庫,我們需要一個儲存、一個數據庫以及最終的一個連線。

第一步是擁有儲存物件。

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

DB 類使用此儲存物件獲取資料庫物件。

db = ZODB.DB(storage)

將 None 傳遞給 DB 建構函式以建立記憶體資料庫。

Db=ZODB.DB(None)

最後,我們建立與資料庫的連線。

conn=db.open()

然後,連線物件透過 ‘root()’ 方法使您能夠訪問資料庫的 ‘root’。‘root’ 物件是包含所有持久化物件的字典。

root = conn.root()

例如,我們將學生列表新增到根物件,如下所示:

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

在提交事務之前,此更改不會永久儲存在資料庫中。

import transaction
transaction.commit()

要儲存使用者定義類的物件,該類必須繼承自 persistent.Persistent 父類。

子類化的優勢

子類化 Persistent 類具有以下優勢:

  • 透過設定屬性,資料庫將自動跟蹤對物件所做的更改。

  • 資料將儲存在其自己的資料庫記錄中。

  • 您可以儲存不屬於 Persistent 子類的的資料,但它將儲存在引用它的任何持久化物件的資料庫記錄中。非持久化物件由其包含的持久化物件擁有,如果多個持久化物件引用相同的非持久化子物件,它們將獲得自己的副本。

讓我們定義一個學生類,如下所示,它是 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()

宣告物件並新增到根,然後提交事務。

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()

資料庫將立即更新。請注意,transaction 類還定義了 abort() 函式,它類似於 SQL 中的 rollback() 事務控制。

廣告

© . All rights reserved.