Python bsddb模块操作Berkeley DB数据库介绍


Posted in Python onApril 08, 2015

bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性能非常好,mysql的存储后端引擎都支持bdb的方式。这里简单介绍一些关于bsddb的使用方法。

bdb不同于一般的关系数据库,它存储的数据只能是以key和value组成的一对数据,使用就像python的字典一样,它不能直接表示多个字段,当要存储多个字段的数据时,只能把数据作为一个整体存放到value中。

使用bsddb面临的第一问题是使用什么数据访问方法,bdb支持四种:btree, hash, queue, recno。这里先说说它们有什么区别,btree是用的树结构来才存储的数据,查询速度很快,可以存储任意复杂的key和value。hash是用的hash算法,速度其实和btree比差不多的,但是当数据量特别巨大时,应该使用hash。queue是队列操作,它有一个限制,它只能存储定长的数据,也就是说value的长度是固定的!但是queue可以保持数据的先进先出,并且对数据的插入做了特殊的优化,并且提供行级锁。queue的key必须是数字。recno和queue类似,但是它可以支持变长的value,它的key同样也是数字。

    这里先对这四种数据访问方法分别做打开数据库,简单插入一条数据的演示。
对于python的bsddb模块来说,打开数据库的操作有两种方式,一是使用原始的接口,就是先打开一个环境,然后从这个环境中打开一个数据库,就像下面:

import bsddb
dbenv = bsddb.db.DBEnv()

dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)

d = bsddb.db.DB(dbenv)

d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)

还有一种方式是python特有的,这个是bsddb模块本身对上面的过程做了包装,比如打开btree的:

import bsddb
db = bsddb.btopen('test.db', 'c')

看起来比上面的简单多了吧。但这种方式提供的接口很有限,也只有很简单的功能,没有第一种的灵活,但是它在python2.5的版本里是线程安全的。这里都介绍一下。
看看一个例子:

#-*- encoding: gb2312 -*-

import os, sys, string

import bsddb, time
home = "db_home"

filename = "test.db"

try:

    # 创建home目录

    os.mkdir(home)

except:

    pass
# 创建数据库环境

dbenv = bsddb.db.DBEnv()

# 打开数据库环境

dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)

# 创建数据库对象

d = bsddb.db.DB(dbenv)

# 打开数据库, 这里的第二个参数就是指定使用什么数据访问方法

# btree是 bsddb.db.DB_BTREE, hash是bsddb.db.DB_HASH

# queu 是 bsddb.db.DB_QUEUE,  recno 是bsddb.db.DB_RECNO

d.open(filename, bsddb.db.DB_BTREE, bsddb.db.DB_CREATE, 0666)

# 插入一条数据,注意queue和recno的key不能是字符串的,应该是数字

d.put('test1', 'zhaowei')    

print d.items()

# 关闭,这时会把数据写回文件

d.close()

dbenv.close()

下面来个使用queue的,注意看有什么区别:
#-*- encoding: gb2312 -*-

import os, sys, string

import bsddb, time
home = "db_home"

filename = "testqueue.db"

try:

    os.mkdir(home)

except:

    pass
dbenv = bsddb.db.DBEnv()

dbenv.open(home, bsddb.db.DB_CREATE | bsddb.db.DB_INIT_MPOOL)

d = bsddb.db.DB(dbenv)

# queue必须要设置一个value的长度,它的value是定长的

d.set_re_len(40)

d.open(filename, bsddb.db.DB_QUEUE, bsddb.db.DB_CREATE, 0666)

# 它的key必须是数字

d.put(1, 'zhaowei')

print d.items()
d.close()

dbenv.close()

那简单的第二种方式使用如下, 要简洁很多了:
import bsddb
d = bsddb.hashopen("aaa.db", "c")

d['test1'] = "zhaowei"

print d.items()

d.close()
Python 相关文章推荐
Python中使用hashlib模块处理算法的教程
Apr 28 Python
Python的Django REST框架中的序列化及请求和返回
Apr 11 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
python 编程之twisted详解及简单实例
Jan 28 Python
Python常见的pandas用法demo示例
Mar 16 Python
python如何实现不可变字典inmutabledict
Jan 08 Python
使用Python制作新型冠状病毒实时疫情图
Jan 28 Python
python os模块在系统管理中的应用
Jun 22 Python
python报错TypeError: ‘NoneType‘ object is not subscriptable的解决方法
Nov 05 Python
详解pandas赋值失败问题解决
Nov 29 Python
python Pexpect模块的使用
Dec 25 Python
Python中Cookies导出某站用户数据的方法
May 17 Python
Python使用scrapy采集数据过程中放回下载过大页面的方法
Apr 08 #Python
在Python中使用M2Crypto模块实现AES加密的教程
Apr 08 #Python
Python使用scrapy采集时伪装成HTTP/1.1的方法
Apr 08 #Python
Python打印scrapy蜘蛛抓取树结构的方法
Apr 08 #Python
使用IPython来操作Docker容器的入门指引
Apr 08 #Python
仅用50行Python代码实现一个简单的代理服务器
Apr 08 #Python
用Python实现一个简单的能够发送带附件的邮件程序的教程
Apr 08 #Python
You might like
可快速识别放射性物质-国外大神教你diy一个开放式辐射探测器
2020/03/12 无线电
一个php作的文本留言本的例子(四)
2006/10/09 PHP
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
php命名空间学习详解
2014/02/27 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
PHP对象相关知识总结
2017/04/09 PHP
PHP开发中解决并发问题的几种实现方法分析
2017/11/13 PHP
JS array 数组详解
2009/03/22 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
2013/05/10 Javascript
Javascript中对象继承的实现小例
2014/05/12 Javascript
jQuery中is()方法用法实例
2015/01/06 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
深入理解JavaScript系列(43):设计模式之状态模式详解
2015/03/04 Javascript
Jquery zTree 树控件异步加载操作
2016/02/25 Javascript
AngularJS自定义控件实例详解
2016/12/13 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
详解angular脏检查原理及伪代码实现
2018/06/08 Javascript
Vue表单输入绑定的示例代码
2018/11/01 Javascript
js实现简单分页导航栏效果
2019/06/28 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
JS数组方法push()、pop()用法实例分析
2020/01/18 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
python中的对象拷贝示例 python引用传递
2014/01/23 Python
python中模块查找的原理与方法详解
2017/08/11 Python
Python基础学习之类与实例基本用法与注意事项详解
2019/06/17 Python
python opencv 二值化 计算白色像素点的实例
2019/07/03 Python
Django框架反向解析操作详解
2019/11/28 Python
Python随机数函数代码实例解析
2020/02/09 Python
详解python polyscope库的安装和例程
2020/11/13 Python
python 利用matplotlib在3D空间中绘制平面的案例
2021/02/06 Python
中介业务员岗位职责
2014/04/09 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
交通事故案件代理词
2015/05/23 职场文书
党员转正大会主持词
2015/07/02 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书