7

shelve 文档说:

选择使用哪个数据库包(例如 dbm、gdbm 或 bsddb)取决于可用的接口。

那什么意识?如何确定选择哪个包?如何严格定义必须选择哪一个?最好使用什么数据库实现?

4

3 回答 3

8

在这里找到它:
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
在链接页面中,有人也在某处发现了这个,但他的链接已失效。

于 2013-02-02T18:35:41.590 回答
4

我认为没有办法自己指定底层数据库。shelve使用anydbm并且anydbm使用whichdb模块,该模块按以下顺序尝试以下底层实现

  • 数据库哈希
  • gdm
  • 数据库
  • 哑巴

您可以使用Shelf的shelve.BsdDbShelf子类来强制使用 bsd*d*b 实现。

于 2012-12-30T17:09:52.640 回答
1

如何确定选择哪个包?

内置模块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模块会讨论一些限制:dbmdbmndbmndbm

[...] 这意味着存储在数据库中的对象(腌制表示)应该相当小,并且在极少数情况下,键冲突可能会导致数据库拒绝更新。

目前尚不清楚这是否仅适用于ndbm适当的接口,或者也适用于兼容性接口;“相当小”在数字上意味着什么;以及这些情况有多“罕见”。

实际上,也有 DBM 绑定的 Ruby 有这样的说法

原始 Berkeley DB 的数据限制为 2GB。Dbm 库有时也会限制键/值对的总大小,以及散列到相同值的所有键的总大小。这些限制可以低至 512 字节。也就是说,gdbm 和最新版本的 Berkeley DB 取消了这些限制。

我假设这没什么好担心的,因为它不太可能ndbm被使用,并且因为达到这些限制中的任何一个都会(希望)抛出一个描述性异常,此时我们需要进一步解决问题。

于 2017-12-12T10:39:54.507 回答