Python Cookbook-7.8 使用 Berkeley DB 数据库

news2025/5/9 14:50:36

任务

你想将一些数据做持久化处理,而且也想体验一下BerkeleyDB数据库的简洁和高效。

解决方案

如果以前在你的计算机中安装过 BerkeleyDB,Python标准库附带的bsddb包(以及可选的 bsddb3,用于访间Berkeley DBrelease 3.2数据库)可以被用来作为 Berkeley DB接口。为了得到 bsddb 或者 bsddb3,如果没有bsddb 的话,应当在 import 声明的时候使用 try/exception:

try:
	from bsddb import db#先试试release 4
except ImportError:
	from bsddb3 import db#没有,再试试release 3
print db.DB_VERSION_STRING
#输出,示例:sleepycat Software:Berkeley DB 4.1.25:(December 19,2002)

为了创建一个数据库,我们要初始化一个 db.DB 对象,然后向它的 open方法传入适当的参数并调用之,如下:

adb = db.DB()
adb.open('db_filename', dbtype = db.DB_HASH, flags = db.DB_CREATE)

当你想创建一个数据库时,db.DB_HASH 是几种可以选择的访问方法中的一种,一个很常见的选择是 db.DB_BTREE,使用 B+树访问(如果你想以排序的方式获取记录,这很方便)。也可以选择构建一个内存数据库,不使用任何持久化文件,只要将None作为文件名和第一个参数传递给 open 方法即可。

一旦有了一个打开的 db.DB 实例,你就可以添加记录了。每条记录由两个字符串构成键和数据:

for i,w in enumerate('some words for example'.split( )):
	adb.put(w,str(i))

可以通过数据库的游标访问记录:

def irecords(curs):
	record = curs.first()
	while record:
		yield record
		record = curs.next()
for key,data in irecords(adb.cursor()):
	print 'key = %r,data = %r' %(key,data)
#输出(the order may vary):
# key = 'some', data = '0'
# key = 'example', data = '3'
# key = 'words', data = '1'
# key = 'for', data = '2'

做完之后,需要关闭数据库:

adb.close()

以后,在同一个或其他的Python程序中,可以给新创建的db.DB 实例的open 方法传递同样的文件名,再次打开该数据库:

the_same_db = db.DB()
the_same_db.open('db_filename')

然后用同样的方式继续工作:

the_same_db.put('skidoo',23')#添加一条记录
the_same_db.put('words','sweet')#替换一条记录
for key,data in irecords(the_same_db.cursor()):
	print 'key=%r,data=%r'%(key,data)
#输出(the order may vary):
# key='some',data='0'
# key='example',data='3'
# key='words',data='sweet'
# key='for',data='2'
# key='skidoo',data='23'

再次提醒,在所有操作结束之后不要忘记关闭数据库:

the_same_db.close()

讨论

Berkeley DB 是一个流行的开源数据库。它不支持SQL,但却很容易使用,并提供了优异的性能,如果你希望掌控全局的话,它给了你充分的自由来控制所发生的一切,可以通过大量的选项、标志以及方法来完成控制。除了Python,我们也可以通过其他语言来访问 Berkeley DB:比如,可以用 Python 程序完成一些修改和查询,然后再使用一个独立的C程序,使用相同的基本开源库(可以从Sleepycat 下载),对同样的数据库做同样的事情。

Python 标准库模块shelve 可以使用 Berkeley DB 作为它的数据库引擎,就像它使用cPickle 进行序列化操作一样。然而,如果记录都是由 pickle.dumps 产生的串,而这些串对于除 Python 之外的任何语言来说都是很难处理的数据,那你将无法用其他语言访问Berkeley DB数据库文件。通过bsddb直接访问 Berkeley DB,数据库引擎能够提供很多高级的功能,而这些都是 shelve无法提供的。

数据库还是 pickle,或者两者都用?
pickle 和 marshal,以及数据库系统如 Berkeley DB 或关系型数据库,它们的应用场合有很大不同,但是仍然有一些重叠的地方
pickle(以及 marshal)本质上是序列化处理:将Python 对象转变成可以传输或者储存的 BLOB,之后可以由另一方接收或者恢复。序列化的数据是被用来重建Pythor对象的,基本上也只能被 Python 应用程序访问。而针对对象或对象的一部分的搜索和选择操作,pickle 不能提供任何支持
数据库(Berkeley DB,关系型数据库,以及其他类型)本质上是以数据为核心的:可以保存或者获取成组的基本类型的数据(大多是字符串和数字),还能够得到很多有关选取和搜索(对于关系型数据,这种支持可以说是海量的)以及跨语言的支持。数据库对于将 Python 对象序列化成数据或者从数据中反序列化出Python 对象一无所知。
数据库和序列化这两种方式也可以被混用。可以用 pickle 将 Python 对象序列化成字节码,然后用数据库储存,或者反过来。但 Python 标准库 shelve 模块只是在一个很底层的层面工作,比如,它可以借助 pickle 来完成序列化和反序列化,或使用bsddb来作为底层的数据库引擎。因此,不要认为两种方式是一种“竞争的”关系——而应该认为两者是一种互相补充的关系。

举个例子,如解决方案中的代码所示,创建一个带有db.DB_HASH 访间方式的数据库我们可以获得最大的效率,不过,你可能也注意到了,用生成器irecords 列出所有的记录时,哈希算法使得记录以一种随机的和无法预测的顺序排列。如果你想以一种排序的方式访问记录,应该使用 db.DB_BTREE方法。BerkeleyDB支持很多高级功能,如事务,可以直接访问数据库来获得这种功能,而不是试图通过anydbm 或者shelve 来访问。

更多的关于 Python 标准库 bsddb 包的详细文档,请参看 http://pybsddb.sourceforge.netbsddb3.html。而关于BerkeleyDB本身的文档、下载以及其他资料,请访问http://www.sleepycat.com。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2371554.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习笔记:数据库——事务

1.内容: 基于现有数据库设计检查点实验,观察比较提交前后执行结果并分析。 2.实现 源码 -- 开启事务 START TRANSACTION;-- 插入一条订单记录(客户ID为10002) INSERT INTO orders (o_date, c_id) VALUES (NOW(), 10002);-- 获…

UE5 Daz头发转Blender曲线再导出ABC成为Groom

先安装Daz to Blender Import插件 【神器】 --DAZ一键导入blender插件的详细安装和使用,自带骨骼绑定和控制器,多姿势动画,Importer桥接插件_哔哩哔哩_bilibili 然后安装DAZHairConverter插件 一分钟将DAZ头发转化成Blender粒子毛发_哔哩哔…

【贪心算法】贪心算法四

贪心算法四 1.最长回文串2.增减字符串匹配3.分发饼干4.最优除法点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃😃 1.最长回文串 题目链接: 409. 最长回文串 题目分析: 给一个包含大小字母的字符串,从里面挑选出来一些字母构成一个…

【漫话机器学习系列】240.真正类率(True Positive Rate,TPR)

理解真正类率(True Positive Rate,TPR):公式、意义与应用 在机器学习与深度学习模型评估中,"真正类率"(True Positive Rate,简称TPR)是一个非常重要的指标。TPR反映了分类…

Linux的基础开发工具

目录 前言: 1、包管理器yum 1.1 软件包的依赖 1.2 镜像源 1.3 查找/安装/卸载软件 2、编辑器vim 2.1 命令模式(默认) 2.1.1 撤销与反撤销 2.1.2 光标定位 2.1.3 复制&&剪切(删除)&&粘贴 2.1.4 替换 2.1.5 插入模式 2.1.6 V-Block模式 …

【Electron】electron-vue 借助 element-ui UI 库助力桌面应用开发

前面文章我们讲过 electron 让可以用 HTML、JS、CSS 开发桌面应用程序。而 electron-vue 是一个结合了 electron 与 vue 的套件。这样我们就能方便地使用 vue 快速开发桌面应用。但是,vue 只是在 js 这层面做了大量的便捷的操作。对 UI 并未过多涉及。此时如果您在开…

Linux基础(最常用基本命令)

1.查看文件ls 1.1 格式 ls 选项 参数,如:ls -lah ~/ 1.2 选项设置: -l:list 以列表方式显示文件 -h:human-readable 以人类可读的方式显示文件大小(会将纯数字转换为kb,mb) -a:all 显示所有的…

含铜废水循环利用体系

在工业绿色转型浪潮中,含铜废水回收技术正以"资源再生智能管控"的双核驱动模式,重构传统水处理产业的价值链。该体系通过构建"精准分离-梯级利用-智慧运维"的闭环系统,不仅突破了重金属废水处理的技术桎梏,更…

MySQL 安装配置(完整教程)

文章目录 一、MySQL 简介二、下载 MySQL三、安装 MySQL四、配置环境变量五、配置 MySQL5.1 初始化 MySQL5.2 搭建 MySQL 环境 六、修改 MySQL 密码七、卸载 MySQL八、结语 一、MySQL 简介 MySQL 是一款广泛使用的开源关系型数据库管理系统(RDBMS)&#…

【JavaScript】二十九、垃圾回收 + 闭包 + 变量提升

文章目录 1、作用域1.1 局部作用域1.2 全局作用域1.3 作用域链 2、JC垃圾回收机制♻️3、GC算法3.1 引用计数法3.2 标记清除法 4、闭包4.1 定义4.2 闭包的应用:实现数据的私有 5、变量提升 1、作用域 即一个范围,离开了这个范围,这个变量就不…

【从零开始学习RabbitMQ | 第一篇】从异步通信到交换机

目录 前言 1.什么是RabbitMQ? 2.同步调用的优缺点 3.异步调用的优缺点 3.1优点: 3.2异步调用的问题是什么? 4技术选型 4.1AMQP协议就是: 4.2kafka和RabbitMQ的使用场景 5.安装RabitMq 6.rabitmq的整体架构 7.RabibtM…

AI(学习笔记第二课) 使用langchain进行AI开发

文章目录 AI(学习笔记第二课) 使用langchain进行AI开发学习内容:1. 使用背景2.创建python(pycharm community版)开发环境并连接deepseek2.1 创建python(pycharm community版)开发环境2.2 创建python工程2.3 写入初始py…

基于Jenkins的DevOps工程实践之Jenkins共享库

文章目录 前言Jenkins共享库结构1、共享库演示2、知识点补充3、实践使用共享库格式化输出日志4、groovy基础语法4.1、 什么是 Groovy?4.2、groovy特点4.3、运行方法4.4、标识符4.5、基本数据类型4.5.1、string类型4.5.2、list类型 4.6、函数使用4.7、正则表达式 5、…

使用Qt自带的Qt assistant时如何添加需要查看的文档

当我们双击打开Qt Assistant时 左边目录栏只有自带的帮助文档,所以需要添加要查看的文档 点击左上角Edit中的Preferences,点击add 找到qdoc文件夹 全选里面的内容 点击Apply 点击ok 左边的目录栏就出现所有这个版本的Qt有关的文档啦

基于网络爬虫+Spark+Hadoop等大数据和SpringBoot技术实现的的汽车行业大数据分析与可视化平台系统(源码+论文+PPT+部署文档教程等)

博主介绍:CSDN毕设辅导第一人、全网粉丝50W,csdn特邀作者、博客专家、腾讯云社区合作讲师、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围…

日本IT|AI应用工程师主要工作内容以及职业前景解析

1. 主要工作内容 AI应用工程师是: 类别具体工作内容常见工具需求分析和业务部门沟通,明确「用AI解决什么问题」PowerPoint, Excel, Miro模型选型与微调用现成AI(如BERT、YOLOv8、Stable Diffusion等)做Fine-TuningPython (PyTor…

Soft Mask(软遮罩)技术

一、概述 Soft Mask是一种技术或工具,主要用于实现平滑的边缘遮罩效果。它在不同的应用领域有不同的实现和定义 1.在Unity UI设计中 SoftMask是一款专为Unity设计的高级遮罩工具,它突破了传统Mask的限制,提供了更为灵活和细腻的UI遮罩解决方案…

ESP32开发之freeRTOS的互斥量

什么是互斥量互斥量的应用场合互斥量的API函数基本代码结构互斥量使用举例递归锁递归锁举例总结什么是互斥量 在freeRTOS中,多个任务访问一块共享资源,会产生竞争现象。 比如马路上只有一个很早以前的电话亭,A、B都想要打电话,然后他们就开始打架了。但是如果A先进去了然…

K8s 资源分类

K8s 资源分类图谱 内置资源的分类 1、工作负载相关: Pod:最小的部署单元,包含一个或多个容器。 Deployment:管理无状态应用的副本和滚动更新。 StatefulSet:适用于有状态应用(如数据库)&#…

基于 Flask的深度学习模型部署服务端详解

基于 Flask 的深度学习模型部署服务端详解 在深度学习领域,训练出一个高精度的模型只是第一步,将其部署到生产环境中,为实际业务提供服务才是最终目标。本文将详细解析一个基于 Flask 和 PyTorch 的深度学习模型部署服务端代码,帮…