shelve
文档说:
选择使用哪个数据库包(例如 dbm、gdbm 或 bsddb)取决于可用的接口。
那什么意识?如何确定选择哪个包?如何严格定义必须选择哪一个?最好使用什么数据库实现?
在这里找到它:
http ://www.gossamer-threads.com/lists/python/python/13891
import shelve
import gdbm
def gdbm_shelve(filename, flag="c"):
return shelve.Shelf(gdbm.open(filename, flag))
db = gdbm_shelve("dbfile")
ps
在链接页面中,有人也在某处发现了这个,但他的链接已失效。
我认为没有办法自己指定底层数据库。shelve使用anydbm并且anydbm使用whichdb模块,该模块按以下顺序尝试以下底层实现
您可以使用Shelf的shelve.BsdDbShelf子类来强制使用 bsd*d*b 实现。
如何确定选择哪个包?
内置模块whichdb
可用于此目的。例如:
In [34]: db = anydbm.open('test.db', 'c')
In [35]: db['test'] = '123'
In [36]: db.close()
In [37]: import whichdb
In [38]: dir(whichdb)
Out[38]:
['__builtins__',
'__doc__',
'__file__',
'__name__',
'__package__',
'_dbmerror',
'dbm',
'os',
'struct',
'sys',
'whichdb']
In [39]: whichdb.whichdb('test.db')
Out[39]: 'dbhash'
最好使用什么数据库实现?
如果底层数据库引擎是(即名为 的 Python 模块,它与 Unix或 BSD DB 或 GNU GDBM 兼容接口),该shelve
模块会讨论一些限制:dbm
dbm
ndbm
ndbm
[...] 这意味着存储在数据库中的对象(腌制表示)应该相当小,并且在极少数情况下,键冲突可能会导致数据库拒绝更新。
目前尚不清楚这是否仅适用于ndbm
适当的接口,或者也适用于兼容性接口;“相当小”在数字上意味着什么;以及这些情况有多“罕见”。
实际上,也有 DBM 绑定的 Ruby 有这样的说法:
原始 Berkeley DB 的数据限制为 2GB。Dbm 库有时也会限制键/值对的总大小,以及散列到相同值的所有键的总大小。这些限制可以低至 512 字节。也就是说,gdbm 和最新版本的 Berkeley DB 取消了这些限制。
我假设这没什么好担心的,因为它不太可能ndbm
被使用,并且因为达到这些限制中的任何一个都会(希望)抛出一个描述性异常,此时我们需要进一步解决问题。