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 许可证,商业用途需注意合规性 。


基本用法示例

  1. 创建/打开数据库(哈希模式)
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()
  1. 遍历所有记录
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()
  1. 使用 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
  1. 打开已有数据库并读取
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()获取数据库统计信息

注意事项

  1. 线程安全:bsddb3 数据库对象不是线程安全的,多线程操作需加锁或每个线程独立打开数据库。
  2. 文件锁:同一时间通常只能有一个写入进程,否则可能报“Resource temporarily unavailable”。
  3. 兼容性:bsddb3 生成的数据库与原生 Berkeley DB 工具(如 db_dump)兼容 。

参考资料

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐