TinyDB - 扩展 TinyDB
可以扩展 TinyDB 并修改其行为。 有四种方法可以做到这一点 −
自定义中间件
自定义存储
挂钩和覆盖
子类化 TinyDB 和表
在本章中,我们将详细了解这些方法。
自定义中间件
有时用户不想编写新的存储模块。 在这种情况下,用户可以修改现有存储模块的行为。 让我们看一个示例,在该示例中我们将构建一个自定义中间件来过滤掉空项 −
首先,让我们看看将通过自定义中间件的数据 −
{ '_default': { 1: {'key1': 'value1'}, 2: {'key2': 'value2'}, ……………, N: {'keyN': 'valueN'} },
现在,让我们看看如何实现自定义中间件 −
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()
自定义存储
如前所述,TinyDB 具有两种类型的存储:内存存储和 JSON 文件存储。 除此之外,TinyDB 还提供了添加我们自己的自定义存储的选项。 在下面的示例中,让我们看看如何使用 PyYAML 添加 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
挂钩和覆盖
有时,自定义存储和自定义中间件都无法按您想要的方式工作。 在这种情况下,用户可以使用预定义的挂钩和覆盖来修改 TinyDB 的行为。 例如,我们将配置默认表的名称,如下所示 −
TinyDB.default_table_name = 'student_detail'
我们还可以按如下方式分配缓存容量 −
TinyDB.table_class.default_query_cache_capacity = 50
子类化 TinyDB 和 Table
这是我们可以用来修改 TinyDB 行为的最后一种方法。 例如,我们将创建一个可以与挂钩和覆盖一起使用的子类来覆盖默认类。
Class ExtendTable(Table): TinyDB.table_class = student_detail