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从sqlite读取并显示数据的方法
May 08 Python
python采集百度百科的方法
Jun 05 Python
Python 实现一个颜色色值转换的小工具
Dec 06 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
Jan 04 Python
Python批量提取PDF文件中文本的脚本
Mar 14 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python直接获取API传递回来的参数方法
Dec 17 Python
从0开始的Python学习016异常
Apr 08 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
基于python实现生成指定大小txt文档
Jul 20 Python
Python爬虫之Selenium多窗口切换的实现
Dec 04 Python
Python字典和列表性能之间的比较
Jun 07 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
Oracle Faq(Oracle的版本)
2006/10/09 PHP
将FCKeditor导入PHP+SMARTY的实现方法
2015/01/15 PHP
thinkPHP数据库增删改查操作方法实例详解
2016/12/06 PHP
javascript 写类方式之四
2009/07/05 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
简单实用的反馈表单无刷新提交带验证
2013/11/15 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
微信小程序非swiper组件实现的自定义伪3D轮播图效果示例
2018/12/11 Javascript
JS/HTML5游戏常用算法之碰撞检测 地图格子算法实例详解
2018/12/12 Javascript
微信小程序 slot踩坑的解决
2019/04/01 Javascript
浅析vue中的nextTick
2020/12/28 Vue.js
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
python+mysql实现简单的web程序
2014/09/11 Python
Python的爬虫包Beautiful Soup中用正则表达式来搜索
2016/01/20 Python
python中range()与xrange()用法分析
2016/09/21 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
详解Python字典的操作
2019/03/04 Python
python爬取基于m3u8协议的ts文件并合并
2019/04/26 Python
Python中的正则表达式与JSON数据交换格式
2019/07/03 Python
python爬虫可以爬什么
2020/06/16 Python
python selenium 获取接口数据的实现
2020/12/07 Python
python 实现客户端与服务端的通信
2020/12/23 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
游戏商店:Eneba
2020/04/25 全球购物
中专自我鉴定范文
2013/10/16 职场文书
自我评价的范文
2014/02/02 职场文书
财务出纳岗位职责
2014/02/03 职场文书
运动会入场式解说词
2014/02/18 职场文书
竞选班委演讲稿
2014/04/28 职场文书
安全生产标语大全
2014/10/06 职场文书
企业战略合作意向书
2015/05/08 职场文书
2019最新版火锅店的创业计划书 !
2019/07/12 职场文书
建国70周年的心得体会(2篇)
2019/09/20 职场文书
Django使用echarts进行可视化展示的实践
2021/06/10 Python
科学家研发出新型速效酶,可在 24 小时内降解塑料制品
2022/04/29 数码科技
python获取带有返回值的多线程
2022/05/02 Python