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 相关文章推荐
Python3基础之函数用法
Aug 13 Python
浅析Python中的多进程与多线程的使用
Apr 07 Python
Python实现抓取网页生成Excel文件的方法示例
Aug 05 Python
python购物车程序简单代码
Apr 18 Python
Python将字符串常量转化为变量方法总结
Mar 17 Python
python实现ip地址查询经纬度定位详解
Aug 30 Python
PyTorch预训练的实现
Sep 18 Python
Python 内置函数globals()和locals()对比详解
Dec 23 Python
Python应用实现处理excel数据过程解析
Jun 19 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
python中二分查找法的实现方法
Dec 06 Python
Python 全局空间和局部空间
Apr 06 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
php iconv() : Detected an illegal character in input string
2010/12/05 PHP
CI框架Session.php源码分析
2014/11/03 PHP
PHP实现字符串翻转功能的方法【递归与循环算法】
2017/11/03 PHP
JS 日期验证正则附asp日期格式化函数
2009/09/11 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
用javascript作一个通用向导说明
2011/08/30 Javascript
鼠标滚轮控制网页横向移动实现思路
2013/03/22 Javascript
JavaScript回调(callback)函数概念自我理解及示例
2013/07/04 Javascript
在JavaScript中实现类的方式探讨
2013/08/28 Javascript
动态加载iframe时get请求传递中文参数乱码解决方法
2014/05/07 Javascript
JavaScript不刷新实现浏览器的前进后退功能
2014/11/05 Javascript
js 创建对象 经典模式全面了解
2016/08/16 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
用 js 的 selection range 操作选择区域内容和图片
2017/04/18 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
jQuery实现点击下拉框中的值累加到文本框中的方法示例
2017/10/28 jQuery
webpack4 升级迁移的实现
2018/09/12 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
对python3 一组数值的归一化处理方法详解
2018/07/11 Python
OpenCV+python手势识别框架和实例讲解
2018/08/03 Python
tensorflow学习教程之文本分类详析
2018/08/07 Python
Python 把序列转换为元组的函数tuple方法
2019/06/27 Python
Django 创建/删除用户的示例代码
2019/07/24 Python
Pandora德国官网:购买潘多拉手链、戒指、项链和耳环
2020/02/20 全球购物
汽车技术服务与营销专业在籍生自荐信
2013/09/28 职场文书
英文版区域经理求职信
2013/10/23 职场文书
工商管理专业大学生职业生涯规划范文
2014/03/09 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
公司员工宿舍管理制度
2015/08/03 职场文书
社区干部培训心得体会
2016/01/06 职场文书
一条 SQL 语句执行过程
2022/03/17 MySQL