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 数据清洗之数据合并、转换、过滤、排序
Feb 12 Python
Anaconda下安装mysql-python的包实例
Jun 11 Python
Python math库 ln(x)运算的实现及原理
Jul 17 Python
Windows10下 python3.7 安装 facenet的教程
Sep 10 Python
wxPython实现带颜色的进度条
Nov 19 Python
Python之指数与E记法的区别详解
Nov 21 Python
jupyter notebook实现显示行号
Apr 13 Python
Python通过文本和图片生成词云图
May 21 Python
Python新手学习函数默认参数设置
Jun 03 Python
Python3读取和写入excel表格数据的示例代码
Jun 09 Python
python基于socket模拟实现ssh远程执行命令
Dec 05 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
全国FM电台频率大全 - 4 山西省
2020/03/11 无线电
php 发送带附件邮件示例
2014/01/23 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
Thinkphp页面跳转设置跳转等待时间的操作
2019/10/16 PHP
js 关键词高亮(根据ID/tag高亮关键字)案例介绍
2013/01/21 Javascript
jquery设置元素的readonly和disabled的写法
2013/09/22 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
用jQuery toggleClass 实现鼠标移上变色
2014/05/14 Javascript
JavaScript 变量、作用域及内存
2015/04/08 Javascript
基于jQuery实现返回顶部实例代码
2016/01/01 Javascript
JavaScript实现字符串与日期的互相转换及日期的格式化
2016/03/07 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
Jquery通过ajax请求NodeJS返回json数据实例
2016/11/08 NodeJs
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
JS实现简易计算器
2020/02/14 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
2020/02/24 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
python实现探测socket和web服务示例
2014/03/28 Python
django Serializer序列化使用方法详解
2018/10/16 Python
使用python去除图片白色像素的实例
2019/12/12 Python
在python中计算ssim的方法(与Matlab结果一致)
2019/12/19 Python
PyTorch和Keras计算模型参数的例子
2020/01/02 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
Charles & Keith欧盟:新加坡时尚品牌
2019/08/01 全球购物
应届生污水处理求职信
2013/11/06 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
工作目标责任书
2014/07/23 职场文书
员工培训协议书
2014/09/15 职场文书
开业庆典致辞
2015/08/01 职场文书
mysql字符串截取函数小结
2021/04/05 MySQL
利用Python实时获取steam特惠游戏数据
2022/06/25 Python