Extend TinyDB trong TinyDB
TinyDB là một thư viện cơ sở dữ liệu nhỏ gọn và linh hoạt dành cho Python, cho phép lưu trữ dữ liệu một cách dễ dàng mà không cần đến hệ quản trị cơ sở dữ liệu phức tạp. Bên cạnh tính năng cơ bản, TinyDB còn cung cấp khả năng mở rộng và tùy chỉnh, cho phép người dùng điều chỉnh cách thức hoạt động của cơ sở dữ liệu. Trong bài viết này, mình sẽ cùng tìm hiểu các phương pháp để mở rộng TinyDB, bao gồm việc sử dụng middleware tùy chỉnh, lưu trữ tùy chỉnh, hooks và overrides, cũng như kế thừa TinyDB và các bảng dữ liệu.
TinyDB cho phép mở rộng và tùy chỉnh hành vi của nó. Có bốn cách chính để thực hiện điều này:
- Middleware tùy chỉnh
- Lưu trữ tùy chỉnh (Custom storages)
- Hooks và overrides
- Kế thừa (Subclassing) TinyDB và Table
Trong phần này, mình sẽ tìm hiểu chi tiết từng phương pháp.
Middleware tùy chỉnh trong TinyDB
Đôi khi người dùng không muốn tạo một module lưu trữ mới mà chỉ cần thay đổi cách thức hoạt động của module lưu trữ hiện tại. Trong trường hợp này, người dùng có thể sử dụng middleware để tùy chỉnh hành vi của cơ sở dữ liệu. Ví dụ, chúng ta sẽ tạo một middleware lọc bỏ các mục trống.
Bài viết này được đăng tại [free tuts .net]
Dữ liệu trước khi đi qua middleware tùy chỉnh:
{ '_default': { 1: {'key1': 'value1'}, 2: {'key2': 'value2'}, ..., N: {'keyN': 'valueN'} } }
Cách triển khai middleware tùy chỉnh:
class RemoveEmptyItemsMiddleware(Middleware): def __init__(self, storage_cls): super(self).__init__(storage_cls) def read(self): data = self.storage.read() for _default in data: st_name = data for doc_id in table: item = st_name if item == {}: del st_name return data def close(self): self.storage.close()
Middleware này sẽ lọc bỏ những mục trống trước khi dữ liệu được lưu trữ.
Lưu trữ tùy chỉnh trong TinyDB
Như đã biết, TinyDB cung cấp hai loại lưu trữ: lưu trữ trong bộ nhớ (in-memory) và lưu trữ bằng file JSON. Tuy nhiên, TinyDB cũng cho phép người dùng thêm các loại lưu trữ tùy chỉnh. Ví dụ, chúng ta sẽ thêm lưu trữ YAML bằng cách sử dụng thư viện PyYAML.
Cách triển khai lưu trữ YAML:
import yaml class YAMLStorage(Storage): def __init__(self, db_json): self.db_json = db_json def read(self): with open(self.db_json) as handle: try: info = yaml.safe_load(handle.read()) return info except yaml.YAMLError: return None def write(self, info): with open(self.db_json, 'w+') as handle: yaml.dump(info, handle) def close(self): pass
Hooks và Overrides trong TinyDB
Nếu cả lưu trữ tùy chỉnh và middleware tùy chỉnh đều không đáp ứng được nhu cầu, người dùng có thể sử dụng hooks và overrides để thay đổi hành vi của TinyDB.
Ví dụ, để cấu hình tên bảng mặc định:
TinyDB.default_table_name = 'student_detail'
Hoặc để đặt dung lượng bộ nhớ cache:
TinyDB.table_class.default_query_cache_capacity = 50
Kế thừa TinyDB và Table
Đây là phương pháp cuối cùng để tùy chỉnh TinyDB. Ví dụ, ta có thể tạo một lớp con (subclass) để ghi đè các lớp mặc định:
class ExtendTable(Table): TinyDB.table_class = student_detail
Kết bài
Bằng cách sử dụng các phương pháp trên, TinyDB cho phép người dùng mở rộng và tùy chỉnh cơ sở dữ liệu một cách linh hoạt, phù hợp với nhiều tình huống khác nhau. Từ việc tạo middleware đến lưu trữ tùy chỉnh, người dùng có thể dễ dàng điều chỉnh TinyDB theo nhu cầu của mình, mang lại hiệu quả cao trong việc xử lý và quản lý dữ liệu.