搁置:选择数据库

时间:2012-12-30 16:50:03

标签: python database serialization persistence shelve

shelve documentation说:

  

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

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

3 个答案:

答案 0 :(得分: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
在链接页面中,有人也发现了这个,但他的链接已经死了。

答案 1 :(得分:4)

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

  • dbhash
  • GDM
  • DBM
  • dumbdbm

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

答案 2 :(得分: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'
  

最适合使用哪种数据库实现?

shelve模块讨论了一些限制,如果底层数据库引擎是dbm(即称为dbm的Python模块,它与Unix ndbm或BSD接口DB或ndbm的GNU GDBM兼容性接口:

  

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

目前尚不清楚这是否仅适用于ndbm本身,还是兼容接口;什么"相当小"意思是数字;以及如何"罕见"是那些案件。

实际上,Ruby也有DBM的绑定,它有this to say

  

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

我认为这没什么可担心的,因为ndbm使用cat /proc/interrupts的可能性很小,因为达到任何这些限制都会(希望)引发描述性异常,我们需要进一步解决这个问题。