TinyDB - 扩展TinyDB


可以扩展 TinyDB 并修改其Behave。有四种方法可以做到这一点 -

  • 定制中间件

  • 定制存储

  • 挂钩和覆盖

  • 子类化 TinyDB 和表

在本章中,我们将详细了解这些方法。

定制中间件

有时用户不想编写新的存储模块。在这种情况下,用户可以修改现有存储模块的Behave。让我们看一个例子,我们将构建一个自定义中间件来过滤掉空项目 -

首先,让我们看看将通过自定义中间件的数据 -

{
   '_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 的Behave。例如,我们将配置默认表的名称,如下所示 -

TinyDB.default_table_name = 'student_detail'

我们还可以分配缓存容量,如下所示 -

TinyDB.table_class.default_query_cache_capacity = 50

子类化 TinyDB 和 Table

这是我们可以用来修改 TinyDB Behave的最后一种方法。例如,我们将创建一个可以与挂钩和覆盖一起使用的子类来覆盖默认类。

Class ExtendTable(Table):
   TinyDB.table_class = student_detail