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实现的多线程端口扫描工具分享
Jan 21 Python
自己编程中遇到的Python错误和解决方法汇总整理
Jun 03 Python
Linux中安装Python的交互式解释器IPython的教程
Jun 13 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
如何用itertools解决无序排列组合的问题
May 18 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
python 使用sys.stdin和fileinput读入标准输入的方法
Oct 17 Python
值得收藏的10道python 面试题
Apr 15 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
深入理解Python 多线程
Jun 16 Python
Python3如何实现Win10桌面自动切换
Aug 11 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
老照片 - 几十年前的收音机与人
2021/03/02 无线电
PHP ajax 分页类代码
2008/11/13 PHP
PHP 引用是个坏习惯
2010/03/12 PHP
php cc攻击代码与防范方法
2012/10/18 PHP
php处理文件的小例子(解压缩,删除目录)
2013/02/03 PHP
通过php动态传数据到highcharts
2017/04/05 PHP
JavaScript 动态创建VML的方法
2009/10/14 Javascript
超级有用的13个基于jQuery的内容滚动插件和教程
2011/07/31 Javascript
JQuery实现鼠标移动到图片上显示边框效果
2014/01/09 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
谈谈我对JavaScript中typeof和instanceof的深入理解
2015/12/25 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
详解Vue双向数据绑定原理解析
2017/09/11 Javascript
Node.js成为Web应用开发最佳选择的原因
2018/02/05 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
怎么使用javascript深度拷贝一个数组
2019/06/06 Javascript
windows实现npm和cnpm安装步骤
2019/10/24 Javascript
vue 查看dist文件里的结构(多种方式)
2020/01/17 Javascript
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
python通过pil模块将raw图片转换成png图片的方法
2015/03/16 Python
Python 爬虫图片简单实现
2017/06/01 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
opencv-python 读取图像并转换颜色空间实例
2019/12/09 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
python 递归调用返回None的问题及解决方法
2020/03/16 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
Python实现树莓派摄像头持续录像并传送到主机的步骤
2020/11/30 Python
css3 background属性调整增强介绍
2010/12/18 HTML / CSS
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
奉献爱心演讲稿
2014/09/04 职场文书
先进教育工作者事迹材料
2014/12/23 职场文书
新学期家长寄语2016
2015/12/03 职场文书
Python-typing: 类型标注与支持 Any类型详解
2021/05/10 Python
Python办公自动化之教你用Python批量识别发票并录入到Excel表格中
2021/06/26 Python