2012-12-30 34 views
6

shelvedocumentation nói:xiên: lựa chọn cơ sở dữ liệu

Sự lựa chọn trong đó gói cơ sở dữ liệu sẽ được sử dụng (ví dụ như dbm, GDBM hoặc bsddb) phụ thuộc vào giao diện có sẵn.

Điều đó có nghĩa là gì? Làm cách nào để xác định gói nào được chọn? Làm thế nào để xác định nghiêm chỉnh cái nào phải được chọn lựa? Việc triển khai cơ sở dữ liệu nào tốt nhất để sử dụng?

Trả lời

7

Tìm thấy nó ở đây:
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
Trong liên kết trang ai cũng tìm thấy một nơi nào đó, nhưng liên kết của mình đã chết.

4

Tôi nghĩ rằng không có cách nào để tự xác định cơ sở dữ liệu lót. xiên sử dụng anydbmanydbm sử dụng các mô-đun whichdb mà cố gắng triển khai underlaying sau theo thứ tự sau đây

  • dbhash
  • gdm
  • dbm
  • dumbdbm

Bạn có thể sử dụng lớp phủ shelve.BsdDbShelf của Kệ để buộc việc sử dụng triển khai bsd * d * b.

+0

Vì vậy, trong trường hợp sử dụng 'shelve.BsdDbShelf', bạn không cần phải có gói' bsddbm'? –

0

Cách xác định gói nào được chọn?

Mô-đun tích hợp whichdb có thể được sử dụng cho điều đó. Ví dụ:

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' 

thực hiện tốt nhất cơ sở dữ liệu gì để sử dụng không?

Các shelve cuộc đàm phán mô-đun về một số hạn chế nếu động cơ DB cơ bản là dbm (ví dụ, các mô-đun Python gọi dbm, giao diện với Unix ndbm hoặc BSD DB hoặc các giao diện tương thích GNU GDBM cho ndbm):

[...] điều này có nghĩa là (đại diện được chọn) các đối tượng được lưu trữ trong cơ sở dữ liệu phải khá nhỏ và trong một số ít trường hợp, các va chạm chính có thể khiến cơ sở dữ liệu từ chối cập nhật.

Không rõ liệu điều này chỉ áp dụng cho ndbm thích hợp hay giao diện tương thích; những gì "khá nhỏ" có nghĩa là về số lượng; và cách "hiếm" là những trường hợp đó.

Trên thực tế, Ruby, cũng đã gán cho DBM, có this to say:

gốc Berkeley DB được giới hạn 2GB dữ liệu. Thư viện Dbm đôi khi cũng giới hạn tổng kích thước của cặp khóa/giá trị và tổng kích thước của tất cả các khóa mà băm có cùng giá trị. Các giới hạn này có thể ít nhất là 512 byte. Điều đó nói rằng, gdbm và các phiên bản gần đây của Berkeley DB loại bỏ các giới hạn này.

Tôi cho rằng điều này không có gì phải lo lắng, bởi vì nó không chắc rằng ndbm sẽ được sử dụng và bởi vì nhấn bất kỳ giới hạn nào (hy vọng) lộn xộn xung quanh hơn nữa.

Các vấn đề liên quan