📜  数据持久性-ZODB

📅  最后修改于: 2020-11-07 08:29:33             🧑  作者: Mango


ZODB( Zope对象数据库)是用于存储Python对象的数据库。它符合ACID标准-在NOSQL数据库中找不到该功能。像许多NoSQL数据库一样,ZODB也是开源的,可水平扩展且无模式。但是,它不是分布式的并且不能提供简单的复制。它为Python对象提供了持久性机制。它是Zope应用服务器的一部分,但也可以独立使用。

ZODB由Zope Corporation的Jim Fulton创建。它从简单的持久对象系统开始。当前版本是5.5.0,并且完全用Python编写。使用Python内置对象持久性(棘手)的扩展版本。

ZODB的一些主要功能是-

  • 交易
  • 历史/撤消
  • 透明可插拔的存储
  • 内置缓存
  • 多版本并发控制(MVCC)
  • 跨网络的可扩展性

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

ZODB对于数据是分层结构且读取次数多于写入次数的应用程序很有用。 ZODB是pickle对象的扩展。这就是为什么只能通过Python脚本进行处理的原因。

要安装最新版本的ZODB,请使用pip实用程序-

pip install zodb

以下依赖项也已安装-

  • B树== 4.6.1
  • cffi == 1.13.2
  • 持续== 4.5.1
  • pycparser == 2.19
  • 六个== 1.13.0
  • 交易== 2.4.0

ZODB提供以下存储选项-

文件存储

这是默认值。一切都存储在一个大的Data.fs文件中,该文件本质上是一个事务日志。

目录存储

每个对象修订版存储一个文件。在这种情况下,不需要在不干净的关闭时重建Data.fs.index。

相对存储

这会将泡菜存储在关系数据库中。支持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 = conn.root()

例如,我们向根对象添加学生列表,如下所示:

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

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

import transaction
transaction.commit()

要存储用户定义的类的对象,该类必须从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()

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