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列表(list)常用操作方法小结
Feb 02 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python之多线程爬虫抓取网页图片的示例代码
Jan 10 Python
Python集合基本概念与相关操作实例分析
Oct 30 Python
python 成功引入包但无法正常调用的解决
Mar 09 Python
python中有函数重载吗
May 28 Python
python 图像判断,清晰度(明暗),彩色与黑白实例
Jun 04 Python
Python爬虫实例——scrapy框架爬取拉勾网招聘信息
Jul 14 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
Python Selenium操作Cookie的实例方法
Feb 28 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安全配置
2006/10/09 PHP
如何开发一个虚拟域名系统
2006/10/09 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
ThinkPHP中使用Ueditor富文本编辑器
2015/09/02 PHP
php函数传值的引用传递注意事项分析
2016/06/25 PHP
Yii框架实现邮箱激活的方法【数字签名】
2016/10/18 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
一个简单的javascript类定义例子
2009/09/12 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
JavaScript去除空格的三种方法(正则/传参函数/trim)
2013/02/06 Javascript
js限制文本框只能输入数字方法小结
2014/06/16 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
jQuery ui实现动感的圆角渐变网站导航菜单效果代码
2015/08/26 Javascript
深入理解jQuery3.0的domManip函数
2016/09/01 Javascript
AngularJs html compiler详解及示例代码
2016/09/01 Javascript
深入探究angular2 UI组件之primeNG用法
2017/07/26 Javascript
让nodeJS支持ES6的词法----babel的安装和使用方法
2017/07/31 NodeJs
Vue的百度地图插件尝试使用
2017/09/06 Javascript
Webpack devServer中的 proxy 实现跨域的解决
2018/06/15 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
jQuery实现为table表格动态添加或删除tr功能示例
2019/02/19 jQuery
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
windows10系统中安装python3.x+scrapy教程
2016/11/08 Python
Python实现字典去除重复的方法示例
2017/07/31 Python
Django中的文件的上传的几种方式
2018/07/23 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
夜大毕业自我鉴定
2013/10/11 职场文书
《北京的春节》教学反思
2014/04/07 职场文书
关于迟到的检讨书
2015/05/06 职场文书
证婚人致辞精选
2015/07/28 职场文书
HAM-2000摩机图
2021/04/22 无线电
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
Golang 并发下的问题定位及解决方案
2022/03/16 Golang