Module shelve trong thư viện chuẩn của Python là công cụ đơn giản nhưng hiệu quả để lưu trữ dữ liệu bền vững khi không cần giải pháp cơ sở dữ liệu quan hệ. Đối tượng shelf được định nghĩa trong module này là đối tượng giống từ điển được lưu trữ bền vững trong tệp đĩa. Điều này tạo ra tệp tương tự như cơ sở dữ liệu dbm trên các hệ thống giống UNIX. Chỉ kiểu dữ liệu chuỗi có thể được dùng làm khóa trong đối tượng từ điển đặc biệt này, trong khi bất kỳ đối tượng có thể pickle hóa nào đều có thể đóng vai trò giá trị.
Module shelve định nghĩa ba lớp như sau:
| STT | Module & Mô tả |
|---|---|
| 1 | Shelf Đây là lớp cơ sở cho các triển khai shelf. Nó được khởi tạo với đối tượng giống dict. |
| 2 | BsdDbShelf Đây là lớp con của Shelf. Đối tượng dict truyền cho constructor của nó phải hỗ trợ các phương thức first(), next(), previous(), last() và set_location(). |
| 3 | DbfilenameShelf Đây cũng là lớp con của Shelf nhưng chấp nhận tên tệp làm tham số cho constructor của nó thay vì đối tượng dict. |
Cách dễ nhất để tạo đối tượng Shelf là sử dụng hàm open() được định nghĩa trong module shelve trả về đối tượng DbfilenameShelf.
open(filename, flag='c', protocol=None, writeback=False)
Tham số filename được gán cho cơ sở dữ liệu được tạo.
Giá trị mặc định cho tham số flag là 'c' cho quyền đọc/ghi. Các cờ khác là 'w' (chỉ ghi), 'r' (chỉ đọc) và 'n' (mới với đọc/ghi).
Tham số protocol biểu thị giao thức pickle. Tham số writeback mặc định là false. Nếu đặt thành true, các mục được truy cập được lưu vào cache. Mọi truy cập gọi các hoạt động sync() và close() do đó quá trình có thể chậm.
Mã sau tạo cơ sở dữ liệu và lưu các mục từ điển trong nó:
import shelve
s = shelve.open("test")
s['name'] = "Ajay"
s['age'] = 23
s['marks'] = 75
s.close()
Thao tác này sẽ tạo tệp test.dir trong thư mục hiện tại và lưu trữ dữ liệu khóa-giá trị ở dạng băm. Đối tượng Shelf có các phương thức sau:
| STT | Phương thức & Mô tả |
|---|---|
| 1 | close() Đồng bộ và đóng đối tượng dict bền vững. |
| 2 | sync() Ghi lại tất cả các mục trong cache nếu shelf được mở với writeback đặt thành True. |
| 3 | get() Trả về giá trị liên kết với khóa. |
| 4 | items() Danh sách các tuple – mỗi tuple là cặp khóa giá trị. |
| 5 | keys() Danh sách khóa shelf. |
| 6 | pop() Xóa khóa được chỉ định và trả về giá trị tương ứng. |
| 7 | update() Cập nhật shelf từ dict/iterable khác. |
| 8 | values() Danh sách giá trị shelf. |
Để truy xuất giá trị của một khóa cụ thể trong shelf:
>>> s = shelve.open('test')
>>> s['age']
23
>>> s['age'] = 25
>>> s.get('age')
25
Các phương thức items(), keys() và values() trả về đối tượng view.
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('marks', 75)]
>>> list(s.keys())
['name', 'age', 'marks']
>>> list(s.values())
['Ajay', 25, 75]
Để xóa cặp khóa-giá trị từ shelf:
>>> s.pop('marks')
75
>>> list(s.items())
[('name', 'Ajay'), ('age', 25)]
Lưu ý cặp khóa-giá trị marks-75 đã bị xóa.
Để hợp nhất các mục của từ điển khác với shelf, sử dụng phương thức update():
>>> d = {'salary': 10000, 'designation': 'manager'}
>>> s.update(d)
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]
Trong bài viết này chúng ta đã học về module shelve cung cấp cơ chế thuận tiện để lưu trữ đối tượng từ điển bền vững.