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模块。
本模块希望可以应用到如下情况中。这个模块用于确保作事情不要太复杂,而在需要复杂的时候也可以提供相关功能。
- 向后兼容。本模块一直希望可以适应各种版本的BDB接口,甚至于1.85接口。这意味着需要创建具备相同接口的,比如btopen()、hashopen()、rnopen()和他们返回的对象接口,特别是first()、last()、next()、prev()这些经常用于避免使用游标的接口。这些都是在 bsddb3.__init__.py 中以Python代码实现的。
- 简单的持续字典。在前面实现的前进了一小步。程序员可能希望直接使用新的DB对象,但是可能仅仅在单一进程或线程中使用。这时程序员并不需要被DBEnv所骚扰,应该尽可能的表现的像一个字典。
- 并发存取字典。这需要具备处理单一写者和多读者的DB对象,常见于多线程或多进程环境。这时需要使用适当的参数创建DBEnv对象。这时并不需要其他附加的操作。
- 高级的基于事务的数据存储。这将会发挥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个测试用例了。