- Python数据持久化教程
 - Python 数据持久化 - 主页
 - Python 数据持久化 - 简介
 - Python 数据持久化 - 文件 API
 - 使用 os 模块进行文件处理
 - Python数据持久化——对象序列化
 - Python 数据持久化 - Pickle 模块
 - Python 数据持久化 - Marshal 模块
 - Python数据持久化——Shelve模块
 - Python数据持久化——dbm包
 - Python 数据持久化 - CSV 模块
 - Python 数据持久化 - JSON 模块
 - Python 数据持久性 - XML 解析器
 - Python 数据持久化 - Plistlib 模块
 - Python数据持久化-Sqlite3模块
 - Python 数据持久化 - SQLAlchemy
 - Python 数据持久化 - PyMongo 模块
 - Python 数据持久化 - Cassandra 驱动程序
 - 数据持久化-ZODB
 - 数据持久化 - Openpyxl 模块
 - Python 数据持久性资源
 - Python 数据持久化 - 快速指南
 - Python 数据持久性 - 有用资源
 - Python 数据持久化 - 讨论
 
数据持久化-ZODB
ZODB(Zope object Database)是用于存储Python对象的数据库。它符合 ACID - NOSQL 数据库中没有的功能。与许多 NoSQL 数据库一样,ZODB 也是开源的、可水平扩展且无模式。然而,它不是分布式的,并且不提供简单的复制。它为Python对象提供持久化机制。它是Zope应用服务器的一部分,但也可以独立使用。
ZODB 由 Zope Corporation 的 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
 - 持久==4.5.1
 - pycparser==2.19
 - 六==1.13.0
 - 交易==2.4.0
 
ZODB 提供以下存储选项 -
文件存储
这是默认设置。所有内容都存储在一个大 Data.fs 文件中,该文件本质上是一个事务日志。
目录存储
这将为每个对象修订存储一个文件。在这种情况下,它不需要在非正常关闭时重建 Data.fs.index。
相关存储
这将 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 = conn.root()
例如,我们将学生列表添加到根对象,如下所示 -
root['students'] = ['Mary', 'Maya', 'Meet']
在我们提交事务之前,此更改不会永久保存在数据库中。
import transaction transaction.commit()
要存储用户定义类的对象,该类必须继承自 persistence.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() 事务控制。