1. 程式人生 > >python模組之bsddb: bdb高效能嵌入式資料庫

python模組之bsddb: bdb高效能嵌入式資料庫

基礎知識
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()