Berkeley DB 3.x & 4.x Python扩展包

Berkeley DB 3.x & 4.x Python扩展包

翻译: gashero <harry.python@gmail.com>

目录

1 简介

这里介绍了一点关于bsddb3.db的Python扩展模块的东西,它包装了Berkeley DB 3.x和4.x的C库。这里的扩展模块指部分纯Python模块。

本模块希望可以应用到如下情况中。这个模块用于确保作事情不要太复杂,而在需要复杂的时候也可以提供相关功能。

  1. 向后兼容。本模块一直希望可以适应各种版本的BDB接口,甚至于1.85接口。这意味着需要创建具备相同接口的,比如btopen()、hashopen()、rnopen()和他们返回的对象接口,特别是first()、last()、next()、prev()这些经常用于避免使用游标的接口。这些都是在 bsddb3.__init__.py 中以Python代码实现的。
  2. 简单的持续字典。在前面实现的前进了一小步。程序员可能希望直接使用新的DB对象,但是可能仅仅在单一进程或线程中使用。这时程序员并不需要被DBEnv所骚扰,应该尽可能的表现的像一个字典。
  3. 并发存取字典。这需要具备处理单一写者和多读者的DB对象,常见于多线程或多进程环境。这时需要使用适当的参数创建DBEnv对象。这时并不需要其他附加的操作。
  4. 高级的基于事务的数据存储。这将会发挥BerkeleyDB的所有能力。程序员在这时可能并非使用字典活其他类似的DB接口,而是传递一个事务对象。另外,这类功能大部分可以简单的通过设置DBEnv的参数来实现,这时可以使用事务,并且在发现死锁时产生异常,等等。

2 提供的类型

bsddb3.db 扩展模块提供如下对象类型:

  • DB :简单的数据库对象,支持Hash/BTree/Recno/Queue的存取方法。
  • DBEnv :提供数据库环境以进行更多高级设置,如事务、日志、并发存取等。
  • DBCursor :一个类似指针的对象,用于遍历数据库。
  • DBTxn :一个数据库事务。支持多文件提交,中断和数据库修改的检查点。
  • DBLock :一个锁的不透明句柄。查看 DBEnv.lock_get()DBEnv.lock_put() 。锁对于数据库中的内容并不重要,但是对多线程或多进程的并发异步访问是很重要的,需要DBEnv的支持。

3 提供的异常

BerkeleyDB的C API使用函数返回码表示错误。而bsddb3.db模块把这些转换成了Python异常,允许使用try-except来处理。

每个错误代码都转换成了一种异常,如下表所示。如果你使用C API文档,也会很容易的关联这些异常。

所有的异常都是继承自DBError异常,如果你希望处理所有异常,可以直接使用DBError。DBNotFoundError在找不到对应的键名时抛出,DBNotFoundError同时也继承自标准的KeyError异常,用来把DB模拟的像一个字典一样。

当抛出任何一个异常时,都会同时包含一个整数值指定错误代码,和一个字符串指定错误信息。

DBError 基类,以下所有都是从这里继承的
DBIncompleteError DB_INCOMPLETE
DBKeyEmptyError DB_KEYEMPTY
DBKeyExistError DB_KEYEXIST
DBLockDeadlockError DB_LOCK_DEADLOCK
DBLockNotGrantedError DB_LOCK_NOTGRANTED
DBNotFoundError DB_NOTFOUND(同时继承自KeyError)
DBOldVersionError DB_OLD_VERSION
DBRunRecoveryError DB_RUNRECOVERY
DBVerifyBadError DB_VERIFY_BAD
DBNoServerError DB_NOSERVER
DBNoServerHomeError DB_NOSERVER_HOME
DBNoServerIDError DB_NOSERVER_ID
DBInvalidArgError EINVAL
DBAccessError EACCESS
DBNoSpaceError ENOSPC
DBNoMemoryError ENOMEM
DBAgainError EAGAIN
DBBusyError EBUSY
DBFileExistsError EEXIST
DBNoSuchFileError ENOENT
DBPermissionsError EPERM

4 其他包模块

  • dbshelve.py :使用Python标准实现的shelve方式存取对象,同时也提供一些高层方法隐藏bdb底层细节。
  • dbtables.py :这个模块是由Gregory Smith实现的一个简单的表格结构。
  • dbutils.py :一个简单的DB接口提供字典的操作方法。
  • dbobj.py :包含DB和DBEnv的子类。
  • dbrecio.py :包含DBRecIO类,允许像读写文件一样存取DB的记录。

5 测试

一个完整的测试套件测试了所有类型的功能,现在使用了 PyUnit 进行自动化测试,已经包含了超过150个测试用例了。

6 参考

查看C API的 在线文档 ,或 这份文档的本地副本 了解更多功能的细节。Python方法的名称与C API中的相似。

Leave a Reply