在哪里可以找到bsddb的使用示例?

8 投票
5 回答
8414 浏览
提问于 2025-04-15 11:04

我花了好几个小时在网上找关于如何使用bsddb模块的例子,但找到的只有这些(来自这里):

data = mydb.get(key)
if data:
    doSomething(data)
#####################
rec = cursor.first()
while rec:
    print rec
    rec = cursor.next()
#####################
rec = mydb.set()
while rec:
    key, val = rec
    doSomething(key, val)
    rec = mydb.next()

有没有人知道哪里可以找到更多(实用的)使用这个包的例子?

或者有没有人愿意分享一下他们自己写的使用这个模块的代码?

编辑:

我选择Berkeley DB的原因是它的可扩展性。我正在对大约220万网页进行潜在语义分析。我简单测试了14个网页,生成了大约50万个记录。所以算一下……我的表里大约会有786亿条记录。

如果有人知道其他高效、可扩展的数据库模型,可以让我用Python访问,请告诉我! (lt_kije提醒我,bsddb在Python 2.6中已经不再推荐使用,并将在3.*中被移除)

5 个回答

5

我假设这个讨论还在进行中,所以我来分享一下。这个代码比较粗糙,也没有检查错误,但可能对你作为起点有帮助。

我想用PHP自带的DBA函数来创建数据库,然后用Python(2.x)脚本来读取这个数据库。下面是创建数据库的PHP脚本:

<?php 
$id=dba_open('visitor.db', 'c', 'db4');
dba_optimize($id);
dba_close($id);
?>

接下来,这是插入数据的PHP代码:我使用JSON来存储“真实”的数据:

<?php 
/* 
    record a visit in a BSD DB
*/
$id=dba_open('visitor.db', 'w', 'db4');
if (!$id) {
    /* dba_open failed */
    exit;
}
$key  = $_SERVER['REQUEST_TIME_FLOAT']; 
$rip  = $_SERVER['REMOTE_ADDR'];
$now  = date('d-m-Y h:i:s a', time()); 
$data = json_encode( array('remote_ip' => $rip, 'timestamp' => $now) );
$userdata=array($key => $data);
foreach ($userdata as $key=>$value) {
dba_insert($key, $value, $id);
}
dba_optimize($id);
dba_close($id);
?>

现在,这段代码才是你我真正感兴趣的,它使用了Python的bsddb3模块。

#!/usr/bin/env python
from bsddb3 import db
import json

fruitDB = db.DB()
fruitDB.open('visitor.db',None,db.DB_BTREE,db.DB_DIRTY_READ)
cursor = fruitDB.cursor()
rec = cursor.first()

while rec:
    print rec
    visitordata = rec[1]
    print '\t' + visitordata
    jvdata = json.loads(visitordata)
    print jvdata
    rec = cursor.next()
    print '\n\n'
print '----';

fruitDB.close()
5

请查看:Lib3/bsddb/test,下载源代码可以去 http://pypi.python.org/pypi/bsddb3/

现在的版本里包含了一些测试,这些测试对你开始使用bsddb3非常有帮助:

test_all.py
test_associate.py
test_basics.py
test_compare.py
test_compat.py
test_cursor_pget_bug.py
test_dbenv.py
test_dbobj.py
test_db.py
test_dbshelve.py
test_dbtables.py
test_distributed_transactions.py
test_early_close.py
test_fileid.py
test_get_none.py
test_join.py
test_lock.py
test_misc.py
test_pickle.py
test_queue.py
test_recno.py
test_replication.py
test_sequence.py
test_thread.py
8

现在大多数人都使用anydbm这个模块来和类似数据库的东西打交道。不过,API基本上就像字典一样;想看看一些例子可以去PyMOTW。需要注意的是,bsddb在2.6.1版本中已经不推荐使用,并且在3.x版本中会被完全移除。换成anydbm会让你升级的时候更简单;如果换成sqlite(现在已经包含在标准库里),你会得到一个更灵活的存储方式。

撰写回答