python bsddb3 使用方法学习笔记
·
bsddb3 是 Python 用于操作 Berkeley DB(BDB)的第三方库,适用于 Python 3。Berkeley DB 是一个嵌入式键值对(key-value)数据库,支持多种数据访问方式(如哈希、B树、队列、RECNO),适合需要高性能、持久化存储的场景。
安装方法
由于 bsddb3 在 PyPI 上的预编译包可能依赖系统 Berkeley DB,推荐以下方式安装:
-
Linux/macOS(推荐使用系统包管理器或源码编译):
pip install bsddb3若提示缺少 Berkeley DB,需先安装 Berkeley DB 库(如通过源码编译)并设置环境变量:
export BERKELEYDB_DIR=/usr/local/BerkeleyDB pip install bsddb3 -
Windows:官方未提供稳定预编译包,建议使用 Unofficial Windows Binaries 下载对应版本的
.whl文件后安装:pip install 下载的bsddb3.whl
注意:Berkeley DB 6.x+ 使用 AGPL 许可证,商业用途需注意合规性 。
基本用法示例
- 创建/打开数据库(哈希模式)
import bsddb3
创建数据库对象
db = bsddb3.db.DB()
打开(或创建)数据库文件,使用哈希存储
db.open('mydb.db', dbtype=bsddb3.db.DB_HASH, flags=bsddb3.db.DB_CREATE)
插入数据(key 和 value 必须为 bytes)
db.put(b'key1', b'value1')
db.put(b'key2', b'123')
查询数据
value = db.get(b'key1') 返回 b'value1'
print(value.decode('utf-8')) 输出: value1
删除记录
db.delete(b'key2')
关闭数据库
db.close()
- 遍历所有记录
import bsddb3
db = bsddb3.db.DB()
db.open('mydb.db', dbtype=bsddb3.db.DB_HASH)
使用游标遍历
cursor = db.cursor()
record = cursor.first()
while record:
key = record[0].decode('utf-8')
value = record.decode('utf-8')
print(f"{key}: {value}")
record = cursor.next()
cursor.close()
db.close()
- 使用 BTree(有序存储)
db = bsddb3.db.DB()
db.open('btree.db', dbtype=bsddb3.db.DB_BTREE, flags=bsddb3.db.DB_CREATE)
db.put(b'2', b'two')
db.put(b'1', b'one')
db.put(b'3', b'three')
BTree 会按 key 排序,遍历时自动有序
for key, value in [(k, v) for k, v in db.items()]:
print(key.decode(), value.decode())
输出顺序: 1, 2, 3
- 打开已有数据库并读取
db = bsddb3.db.DB()
db.open('mydb.db') 不指定 dbtype 会自动识别
print(db.get(b'key1')) b'value1'
db.close()
数据类型说明
- Key 和 Value:必须为
bytes类型。若存储字符串,需.encode('utf-8');读取后用.decode('utf-8')转回字符串 。 - 支持复杂结构(如 JSON、pickle):先序列化再存储。
import json
data = {'name': 'Alice', 'age': 30}
db.put(b'user', json.dumps(data).encode('utf-8'))
读取时
loaded = json.loads(db.get(b'user').decode('utf-8'))
常用方法汇总
| 方法 | 说明 |
|---|---|
open(filename, dbtype, flags) | 打开/创建数据库 |
put(key, value) | 插入或更新键值对 |
get(key, default=None) | 获取值,不存在返回 default |
delete(key) | 删除指定 key |
cursor() | 返回游标对象,用于遍历 |
close() | 关闭数据库 |
stat() | 获取数据库统计信息 |
注意事项
- 线程安全:
bsddb3数据库对象不是线程安全的,多线程操作需加锁或每个线程独立打开数据库。 - 文件锁:同一时间通常只能有一个写入进程,否则可能报“Resource temporarily unavailable”。
- 兼容性:
bsddb3生成的数据库与原生 Berkeley DB 工具(如db_dump)兼容 。
参考资料
更多推荐


所有评论(0)