2012-12-30 25 views
6

shelvedocumentation的選擇說:擱置:數據庫

其中數據庫包將被使用(如DBM,GDBM 或bsddb)取決於哪個接口是可用的選擇。

這是什麼意思?如何確定選擇哪個包?如何嚴格定義哪一個必須選擇?什麼數據庫實現最適合使用?

回答

7

在這裏找到:
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
在鏈接頁面的人也發現了這個地方,但他的鏈接已經死了。

4

我想沒有辦法自己指定底層數據庫。 擱置使用anydbmanydbm使用它試圖以下列順序將以下墊層實現中whichdb模塊

  • dbhash
  • GDM
  • DBM
  • dumbdbm

您可以使用擱置.BsdDbShelf子類擱置強制使用bsd * d * b實現。

+0

那麼,如果使用'shelve.BsdDbShelf',你不需要'bsddbm'包可用? –

0

如何確定選擇哪個包?

內置模塊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模塊會談如果基礎DB引擎是dbm(即,稱爲dbm Python的模塊,該模塊使用Unix ndbm或BSD DB或ndbm的GNU GDBM兼容性接口的接口):

這意味着存儲在數據庫中的對象(醃製表示)應該相當小,並且在極少數情況下,重要衝突可能會導致數據庫拒絕更新。

目前尚不清楚這是否僅適用於ndbm本身,或兼容性接口也是如此; 「相當小」的含義是多少;以及這些情況如何「罕見」。

其實,紅寶石,其中也有綁定DBM,有this to say

原始的Berkeley DB被限制在2GB的數據。 Dbm庫有時還會限制鍵/值對的總大小,以及散列爲相同值的所有鍵的總大小。這些限制可能只有512個字節。也就是說,gdbm和Berkeley DB的最新版本取消了這些限制。

我假設這是沒有什麼可擔心的,因爲它是相當不可能的ndbm將被使用,因爲擊中任何這些限制會(希望)拋出一個異常的描述,在這一點上,我們需要進一步亂七八糟。