Python 数据持久化 - ZODB

ZODB (Zope object Database) 是用于存储 Python 对象的数据库。 它符合 ACID - NOSQL 数据库中没有的功能。 与许多 NoSQL 数据库一样,ZODB 也是开源的、可水平扩展和无架构的。 但是,它不是分布式的,并且不提供简单的复制。 它为 Python 对象提供持久化机制。 它是 Zope Application Server 的一部分,但也可以独立使用。

ZODB 由 Zope Corporation 的 Jim Fulton 创建。 它最初是作为简单的持久对象系统。 它的当前版本是 5.5.0,完全用 Python 编写。 使用 Python 内置对象持久性 (pickle) 的扩展版本。

ZODB 的一些主要功能是 −

  • 事务
  • 历史记录/撤销
  • 透明的可插拔存储
  • 内置缓存
  • 多版本并发控制 (MVCC)
  • 跨网络的可伸缩性

ZODB 是一个分层 数据库。 有一个根对象,在创建数据库时初始化。 根对象像 Python 字典一样使用,它可以包含其他对象(它们本身可以是字典)。 要将对象存储在数据库中,只需将其分配给其容器内的新 key 键即可。

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

这将 pickles 存储在关系数据库中。 支持 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 对象中添加一个学生列表如下 −

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

在我们提交事务之前,此更改不会永久保存在数据库中。

import transaction
transaction.commit()

要存储用户定义类的对象,该类必须继承自 persistent.Persistent 父类。


子类化的优点

子类化Persistent类有如下优点 −

  • 数据库将自动跟踪通过设置属性所做的对象更改。

  • 数据将保存在自己的数据库记录中。

  • 您可以保存不属于 Persistent 子类的数据,但它将存储在引用它的任何持久对象的数据库记录中。 非持久对象由包含它们的持久对象拥有,如果多个持久对象引用同一个非持久子对象,它们将获得自己的副本。

让我们定义一个 student 类继承 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() 方法的帮助下,可以将添加到 root 的所有对象的列表作为视图对象检索,因为 root 根对象类似于内置字典。

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

要从 root 根中获取特定对象的属性,

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

该对象可以轻松更新。 由于 ZODB API 是纯 Python 包,因此不需要使用任何外部 SQL 类型语言。

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

数据库会即时更新。 注意事务类还定义了abort()函数,类似于SQL中的rollback()事务控制。