- 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 对象数据库**) 是用于存储 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() 事务控制。