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实现向QQ群成员自动发邮件的方法
Nov 19 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
深入理解Python3中的http.client模块
Mar 29 Python
机器学习python实战之手写数字识别
Nov 01 Python
Python中的二维数组实例(list与numpy.array)
Apr 13 Python
Python自定义函数计算给定日期是该年第几天的方法示例
May 30 Python
PyCharm 创建指定版本的 Django(超详图解教程)
Jun 18 Python
Python使用gluon/mxnet模块实现的mnist手写数字识别功能完整示例
Dec 18 Python
Python要如何实现列表排序的几种方法
Feb 21 Python
Python控制台实现交互式环境执行
Jun 09 Python
Python 代码调试技巧示例代码
Aug 11 Python
如何使用python自带IDLE的几种方法
Oct 10 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写的求多项式导数的函数代码
2012/07/04 PHP
yii上传文件或图片实例
2014/04/01 PHP
ThinkPHP中的create方法与自动令牌验证实例教程
2014/08/22 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
Smarty模板常见的简单应用分析
2016/11/15 PHP
php简单实现单态设计模式的方法分析
2017/07/28 PHP
利用PHP内置SERVER开启web服务(本地开发使用)
2020/01/22 PHP
javascript中直接引用Microsoft的COM生成Word
2014/01/20 Javascript
不想让浏览器运行javascript脚本的方法
2015/11/20 Javascript
第五章之BootStrap 栅格系统
2016/04/25 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
将json转换成struts参数的方法
2016/11/08 Javascript
js实现前端分页页码管理
2017/01/06 Javascript
Vue分页组件实例代码
2017/04/17 Javascript
微信小程序 配置顶部导航条标题颜色的实现方法
2017/09/20 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
使用Vue构建可重用的分页组件
2018/03/26 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
详解微信小程序中var、let、const用法与区别
2020/01/11 Javascript
将图片文件嵌入到wxpython代码中的实现方法
2014/08/11 Python
详解Django中的form库的使用
2015/07/18 Python
Python中使用haystack实现django全文检索搜索引擎功能
2017/08/26 Python
python 寻找优化使成本函数最小的最优解的方法
2017/12/28 Python
对python中的pop函数和append函数详解
2018/05/04 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
利物浦足球俱乐部官方网上商店:Liverpool FC Official Store
2018/01/13 全球购物
大学四年规划书范文
2013/12/27 职场文书
入学申请自荐信范文
2014/02/26 职场文书
全国爱牙日活动总结
2015/02/05 职场文书
《山中访友》教学反思
2016/02/24 职场文书
创业计划书之闲置物品置换中心
2019/12/25 职场文书
详解运行Python的神器Jupyter Notebook
2021/06/03 Python
教你如何使用Python Tkinter库制作记事本
2021/06/10 Python
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android
Docker安装MySql8并远程访问的实现
2022/07/07 Servers