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程序与C程序的结合使用
Apr 07 Python
简单谈谈Python中的json与pickle
Jul 19 Python
浅谈Python 递归算法指归
Aug 22 Python
修改 CentOS 6.x 上默认Python的方法
Sep 06 Python
Python 元组操作总结
Sep 18 Python
Django中自定义查询对象的具体使用
Oct 13 Python
安装PyInstaller失败问题解决
Dec 14 Python
python django中8000端口被占用的解决
Dec 17 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
Mar 10 Python
python中id函数运行方式
Jul 03 Python
Python如何实现线程间通信
Jul 30 Python
Django程序的优化技巧
Apr 29 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
再说下636单管机
2021/03/02 无线电
在项目中寻找代码的坏命名
2012/07/14 PHP
详解WordPress开发中get_header()获取头部函数的用法
2016/01/08 PHP
PHP会话操作之cookie用法分析
2016/09/28 PHP
php封装的表单验证类完整实例
2016/10/19 PHP
php实现对文件压缩简单的方法
2019/09/29 PHP
JS的location.href跳出框架打开新页面的方法
2014/09/04 Javascript
AngularJS模块详解及示例代码
2016/08/17 Javascript
老生常谈jquery id选择器和class选择器的区别
2017/02/12 Javascript
值得收藏的vuejs安装教程
2017/11/21 Javascript
Vue完整项目构建(进阶篇)
2018/02/10 Javascript
使用svg实现动态时钟效果
2018/07/17 Javascript
Vue.js组件实现选项卡以及切换特效
2019/07/24 Javascript
微信小程序动态添加和删除组件的现实
2020/02/28 Javascript
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
python和pyqt实现360的CLable控件
2014/02/21 Python
在Django中同时使用多个配置文件的方法
2015/07/22 Python
在Python中移动目录结构的方法
2016/01/31 Python
详解Python中heapq模块的用法
2016/06/28 Python
python学习之面向对象【入门初级篇】
2017/01/21 Python
Python 文件操作的详解及实例
2017/09/18 Python
python使用tkinter实现简单计算器
2018/01/30 Python
在python中以相同顺序shuffle两个list的方法
2018/12/13 Python
详解用python写网络爬虫-爬取新浪微博评论
2019/05/10 Python
python实现图片中文字分割效果
2019/07/22 Python
python hash每次调用结果不同的原因
2019/11/21 Python
使用pytorch和torchtext进行文本分类的实例
2020/01/08 Python
Python datetime 格式化 明天,昨天实例
2020/03/02 Python
Python3标准库glob文件名模式匹配的问题
2020/03/13 Python
解决import tensorflow as tf 出错的原因
2020/04/16 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
架构师岗位职责
2013/11/18 职场文书
《扇形统计图》教学反思
2016/02/17 职场文书
golang 实现并发求和
2021/05/08 Golang
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫