- TinyDB教程
- TinyDB - 主页
- TinyDB - 简介
- TinyDB - 环境设置
- TinyDB - 插入数据
- TinyDB - 检索数据
- TinyDB - 更新数据
- TinyDB - 删除数据
- TinyDB - 查询
- TinyDB - 搜索
- TinyDB - where 子句
- TinyDB - Exists() 查询
- TinyDB - Matches() 查询
- TinyDB - Test() 查询
- TinyDB - Any() 查询
- TinyDB - All() 查询
- TinyDB - one_of() 查询
- TinyDB - 逻辑否定
- TinyDB - 逻辑与
- TinyDB - 逻辑或
- TinyDB - 处理数据查询
- TinyDB - 修改数据
- TinyDB - 更新数据
- TinyDB - 检索数据
- TinyDB - 文档ID
- TinyDB - 表
- TinyDB - 默认表
- TinyDB - 缓存查询
- TinyDB - 存储类型
- TinyDB - 中间件
- TinyDB - 扩展TinyDB
- TinyDB - 扩展
- TinyDB 有用资源
- TinyDB - 快速指南
- TinyDB - 有用的资源
- TinyDB - 讨论
TinyDB - 快速指南
TinyDB - 简介
什么是TinyDB?
TinyDB采用纯Python编程语言编写,是一个小型、轻量级的文档型数据库,无外部依赖。它提供了简单的 API,使其易于使用。我们可以使用TinyDB数据库进行小型项目应用,无需任何配置。
TinyDB模块作为Python程序的第三方模块,可用于存储、检索和修改JSON格式的数据。
TinyDB的特点
TinyDB 是一个干净、自由的数据库,可以操作多种格式的文档。它具有以下特点。
非常小- TinyDB 数据库本质上非常小,只有 1800 行代码和 1600 行测试。
易于使用- TinyDB 因其简单干净的 API 而易于使用。
面向文档- 在TinyDB中,我们可以存储任何文档。该文档将表示为 dict。
独立- TinyDB 数据库独立于任何外部服务器和 PyPI 的外部依赖项。
与 Python 3.6 或最新版本兼容- TinyDB 经过测试并与 Python 3.6 及最新版本兼容。它也可以与 PyPY3 配合使用。
可扩展- TinDB 可以通过编写新存储或修改存储的Behave轻松扩展。
TinyDB的优点
TinyDB 为学生、用户和开发人员提供了各种好处。
TinyDB是开源数据库,不需要任何外部配置。
它非常易于使用,用户可以毫不费力地处理文档。
它自动将文档存储在数据库中。
TinyDB 对于需要安装一些数据的个人项目来说是理想的选择。
它适合那些会被 SQL 或外部数据库服务器等大型数据库淹没的小型应用程序。
它使用简单的命令行和查询来操作数据。
测试覆盖率为 100%,即无需解释。
TinyDB 的局限性
如果您需要,TinyDB 将不是您项目的正确选择 -
为表创建索引,
管理表之间的关系,
使用 HTTP 服务器,或者
从多个处理器访问。
与其他数据库的比较
下表重点介绍了 TinyDB 与 MySQL 和 Oracle 数据库的不同之处 -
比较依据 | MySQL | 甲骨文 | 小型数据库 |
---|---|---|---|
配置 | 多种配置 | 多种配置 | 更少的配置,轻量级数据库 |
复杂的 | 是的 | 是的 | 不,易于使用且无干扰 |
价格实惠 | 不 | 不 | 比其他数据库经济实惠 |
易于管理 | 数据库大,管理难度大 | 数据库大,管理难度大 | 小巧且易于管理 |
TinyDB - 环境设置
TinyDB 设置的先决条件
要安装 TinyDB,您的系统中必须安装 Python 3.6 或更高版本。您可以访问链接www.python.org并选择适合您操作系统的最新版本,即 Windows 和 Linux/Unix。我们有一个关于 Python 的综合教程,您可以在www.tutorialspoint.com上参考
安装TinyDB
您可以通过三种不同的方式安装 TinyDB:使用 Pack Manager、从其源代码或从 GitHub。
使用包管理器
TinyDB 的最新发行版本可通过包管理器pip和conda获得。让我们检查一下如何使用它们来安装 TinyDB -
要使用pip安装 TinyDB ,您可以使用以下命令 -
pip install tinydb
要通过conda-forge安装 TinyDB ,您可以使用以下命令 -
conda install -c conda-forge tinydb
从源头
您还可以从源代码分发安装 TinyDB。转到链接https://pypi.org/project/tinydb/#files下载文件并从源代码构建它。
来自 GitHub
要使用 GitHub 安装 TinyDB,请获取最新的开发版本,解压文件,然后使用以下命令进行安装 -
pip install
设置 TinyDB
安装后,请使用以下步骤设置 TinyDB 数据库。
第 1 步:导入 TinyDB 及其查询
首先,我们需要导入 TinyDB 及其查询。使用以下命令 -
from tinydb import TinyDB, Query
第 2 步:创建文件
TinyDB 数据库可以存储多种格式的数据,例如 XML、JSON 等。我们将使用以下文件创建一个 JSON 文件 -
db = TinyDB('Leekha.json')
上面的命令将创建 TinyDB 类的实例并将文件 Leekha.Json 传递给它。这是我们的数据将被存储的文件。现在,TinyDB 数据库设置已准备就绪,您可以对其进行操作。现在我们可以插入数据并操作数据库中的值。
卸载TinyDB
如果您需要卸载 TinyDB,可以使用以下命令 -
pip uninstall tinydb
TinyDB - 插入数据
我们已经创建了 TinyDB 的实例,并将一个 JSON 文件传递给它,用于存储我们的数据。现在是时候将项目插入我们的数据库了。数据应采用 Python 字典的形式。
句法
要插入项目,您可以使用insert()方法,其语法如下 -
db.insert({'type1': 'value1', 'type2': 'value2', 'typeN': 'valueN'})
我们也可以先创建一个字典,然后使用 insert() 方法将数据插入到数据库中。
data_item = {'type1': 'value1', 'type2': 'value2', 'typeN': 'valueN' } db.insert(data_item)
运行上述命令后,insert()方法将返回新创建的对象的ID。而且,我们的 JSON 文件将如下所示 -
{"_default": {"1": {"type1": "value1", "type2": "value2", "typeN": "valueN"}}}
看上面的表条目:' default '是表的名称,' 1 '是新创建的对象的ID,值是我们刚刚插入的数据。
示例:插入单个项目
让我们借助示例来理解上述概念。假设我们有一个数据库,其中包含显示学号、姓名、分数、科目和地址的学生信息。以下是存储在数据库中的信息 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"oracle", "address":"benglore" } ]
在上面的数据库中,如果要插入新的学生记录(即单个项目),请使用以下命令 -
db.insert({ 'roll_number': 6, 'st_name':'jim', 'mark':300, 'subject':'sql', 'address':'pune' })
它将返回新创建的对象的 ID -
6
让我们再输入一项记录-
db.insert({ 'roll_number': 7, 'st_name':'karan', 'mark':290, 'subject':'NoSQL', 'address':'chennai' })
它将返回新创建的对象的 ID -
7
如果您想检查数据库中存储的项目,请使用all()方法,如下所示 -
db.all()
它将产生以下输出-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"oracle", "address":"benglore" }, { "roll_number":6, "st_name":"jim", "mark":300, "subject":"sql", "address":"pune" }, { "roll_number":7, "st_name":"karan", "mark":290, "subject":"NoSQL", "address":"chennai" } ]
您可以观察到它在 JSON 文件中添加了两个新数据项。
示例:一次插入多个项目
您还可以在 TinyDB 数据库中一次插入多个项目。为此,您需要使用insert_multiple()方法。让我们看一个例子 -
items = [ {'roll_number': 8, 'st_name': 'petter', 'address': 'mumbai'}, {'roll_number': 9, 'st_name': 'sadhana', 'subject': 'SQL'} ] db.insert_multiple(items)
现在,使用 all() 方法检查数据库中存储的项目,如下所示 -
db.all()
它将产生以下输出-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"oracle", "address":"benglore" }, { "roll_number":6, "st_name":"jim", "mark":300, "subject":"sql", "address":"pune" }, { "roll_number":7, "st_name":"karan", "mark":290, "subject":"NoSQL", "address":"chennai" }, { "roll_number":8, "st_name":"petter", "address":"mumbai" }, { "roll_number":9, "st_name":"sadhana", "subject":"SQL" } ]
您可以观察到它在 JSON 文件中添加了两个新数据项。您还可以在添加最后两项时跳过数据项中的一些键值(就像我们所做的那样)。我们跳过了“标记”和“地址”。
TinyDB - 检索数据
您可以通过多种方式从 TinyDB 数据库检索数据。但要使用这些方法,您首先需要创建 Query 类的实例,如下所示 -
from tinydb import Query Student = Query()
这里,Student是数据库的名称。
让我们检查一下从 TinyDB 数据库检索信息的各种方法。
使用 Search() 方法检索数据
search() 方法,顾名思义,返回与我们提供的查询匹配的项目列表,否则它将返回一个空列表。
对于这个例子和其他例子,我们将使用以下学生数据库数据 -
[ { "roll_number": 1, "st_name": "elen", "mark": 250, "subject": "TinyDB", "address": "delhi" }, { "roll_number": 2, "st_name": "Ram", "mark": [ 250, 280 ], "subject": [ "TinyDB", "MySQL" ], "address": "delhi" }, { "roll_number": 3, "st_name": "kevin", "mark": [ 180, 200 ], "subject": [ "oracle", "sql" ], "address": "keral" }, { "roll_number": 4, "st_name": "lakan", "mark": 200, "subject": "MySQL", "address": "mumbai" }, { "roll_number": 5, "st_name": "karan", "mark": 275, "subject": "TinyDB", "address": "benglore" } ]
让我们举个例子来理解 search() 方法 -
from tinydb import TinyDB, Query db = TinyDB("leekha.json") student = Query() db.search(student.subject == 'TinyDB' )
上述查询将从学生数据库中检索以下输出-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
使用 get() 方法检索数据
与 search() 方法相反,get() 方法仅返回一个匹配文档。否则它将返回 None。例如,我们采用以下代码 -
from tinydb import TinyDB, Query student = Query() db.get(student.subject == 'TinyDB' )
上述查询将从学生数据库中检索以下数据。
[{'roll_number': 1, 'st_name': 'elen', 'mark': 250, 'subject': 'TinyDB', 'address': 'delhi'}]
使用 all() 方法检索数据
all ()方法返回数据库中的所有文档。例如,
db.all()
它将从学生数据库中检索整个数据。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
使用 for 循环检索数据
for 循环还返回数据库中的所有文档。例如,
for info in db: print(info)
就像 all() 方法一样,它将检索学生数据库中的所有行。
TinyDB - 更新数据
TinyDB可以存储多种格式的数据,我们可以使用各种方法轻松检索存储的数据。但有时,我们需要更新数据,为此我们可以使用update()方法。
为了更新数据库,我们首先需要创建Query类的实例。您可以使用以下命令来实现此目的 -
from tinydb import Query Student = Query()
这里,Student是我们数据库的名称。
update() 方法
这是 update() 方法的语法 -
db.update({ updated field: updated information… }, stable field: information)
让我们通过一个例子来了解 update() 方法是如何工作的。对于这个例子,我们将使用以下学生数据库 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
根据给定的数据,roll_number为“1”的学生的名字是“elen”。以下查询会将学生姓名更新为“Adam” -
from tinydb import TinyDB, Query student = Query() db.update({'st_name' : 'Adam'}, student.roll_number == 1 )
它将返回更新后的对象的 id -
[1]
现在,您可以使用 all() 方法来查看更新的数据库 -
db.all()
它将显示更新的数据 -
[ { "roll_number":1, "st_name":"Adam", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
有时,我们需要更新数据库中所有文档的一个或多个字段。为此,我们可以直接使用update()方法,不需要编写查询参数。以下查询会将所有学生的地址更改为“College_Hostel” -
db.update({'address': 'College_Hostel'})
它将返回更新后的对象的 id -
[1,2,3,4,5]
同样,您可以使用 all() 方法来查看更新的数据库。
db.all()
它将显示更新的数据 -
[ { "roll_number":1, "st_name":"Adam", "mark":250, "subject":"TinyDB", "address":"College_Hostel" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":" College_Hostel " }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":" College_Hostel " }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":" College_Hostel " }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":" College_Hostel " } ]
观察所有行的地址字段具有相同的数据,即“College_Hostel”。
TinyDB - 删除数据
如果您需要从 TinyDB 数据库中永久删除一组特定数据,可以使用remove()方法来实现。与检索和更新数据一样,您首先需要创建Query类的实例来删除数据。您可以使用以下命令来实现此目的 -
from tinydb import Query Student = Query()
这里,Student是我们数据库的名称。
移除()方法
这是remove()方法的语法 -
db.remove( Query() field regex )
remove() 方法接受可选条件以及可选的文档 ID 列表。
学生数据库
我们将使用以下学生数据库作为本章的示例。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
示例:删除单行数据
让我们通过一个例子来理解remove()方法。
from tinydb import TinyDB, Query student = Query() db.remove(student.roll_number == 5)
上面的查询将删除学生学号为 5 的数据。它将返回被删除对象的 ID -
[5]
现在,我们可以使用 all() 方法来查看更新后的数据库。
db.all()
它将显示更新数据库中的数据 -
[ { "roll_number":1, "st_name":"Adam", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" } ]
示例:删除多行数据
如果您想一次删除多行,可以使用remove()方法,如下所示:
from tinydb import TinyDB, Query student = Query() db.remove(student.roll_number > 2)
它将返回已删除对象的 ID:
[3,4]
使用 all() 方法查看更新的数据库。
db.all()
它将显示更新数据库中的数据 -
[ { "roll_number":1, "st_name":"Adam", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" } ]
示例:删除整个数据
如果要从数据库中删除所有数据,可以使用truncate()方法,如下所示 -
db.truncate()
接下来,使用 all() 方法查看更新的数据库。
db.all()
它将显示一个空数据库作为输出-
[]
TinyDB - 查询
TinyDB 拥有丰富的查询集。我们有多种方法来构造查询:第一种方法类似于 ORM 工具的语法,第二种方法是使用“Where”子句的传统方法。
在本章中,我们将了解在 TinyDB 数据库中构造查询的两种方法。
第一种方法:导入查询
第一种方法类似于 ORM 工具的语法,首先我们需要在命令提示符中导入查询。导入后,我们就可以使用查询对象来操作TinyDB数据库了。语法如下-
from tinydb import Query student = Query()
这里,“student”是我们数据库的名称。对于示例,我们将使用以下学生数据库。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
例子
以下是从学生数据库中检索数据的查询,其中学生的roll_no小于 3 -
>>> db.search(Query().roll_number < 3)
或者,
>>> student = Query() >>> db.search(student.roll_number < 3)
上述搜索查询将产生以下结果 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" } ]
有时文件名不是有效的 Python 标识符。在这种情况下,我们将无法访问该字段。对于这种情况,我们需要切换到字典访问表示法,如下所示 -
student = Query(); # Invalid Python syntax db.search(student.security-code == 'ABCD') # Use the following dict access notation db.search(student['security-code'] == 'ABCD')
第二种方法:使用“where”子句
第二种方法是使用“where”子句构建查询的传统方法。语法如下-
from tinydb import where db.search(where('field') == 'value')
例子
TinyDB主题字段的“ where ”子句-
db.search(where('subject') == 'MySQL')
上述查询将产生以下输出-
[{ "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }]
TinyDB - 搜索
TinyDB 提供了search()方法来帮助您从文档中搜索任何数据。与query()对象一起,search() 方法可用于查找 JSON 文件中的数据。我们可以通过多种方式在 TinyDB 数据库上使用 search() 方法。
方法 1:TinyDB search() 与字段的存在性
我们可以根据字段的存在性从数据库中搜索数据。让我们通过一个例子来理解它。对于此示例和其他示例,我们将使用以下学生数据库。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
例子
基于字段是否存在的搜索查询如下 -
from tinydb import Query student = Query() db.search(student.address.exists())
上述查询将从学生文件中检索以下数据-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
方法2:使用正则表达式的TinyDB search()
我们可以使用正则表达式(Regex)从数据库中搜索特定数据。让我们通过几个例子来了解它是如何工作的。
实施例1
与正则表达式匹配的完整项目搜索 -
from tinydb import Query student = Query() db.search(student.st_name.matches('[aZ]*'))
该查询将产生以下输出-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
示例2
使用正则表达式区分大小写的搜索 -
from tinydb import Query import re student = Query() db.search(student.st_name.matches('lakan', flags=re.IGNORECASE))
它将产生以下输出-
[{ 'roll_number': 4, 'st_name': 'lakan', 'mark': 200, 'subject': 'MySQL', 'address': 'mumbai' }]
实施例3
与正则表达式匹配的项目的任何部分 -
from tinydb import Query student = Query() db.search(student.st_name.search('r+'))
该查询将产生以下输出-
[{ 'roll_number': 5, 'st_name': 'karan', 'mark': 275, 'subject': 'TinyDB', 'address': 'benglore' }]
方法 3:使用子字符串的 TinyDB search()
我们还可以在从 TinyDB 数据库中搜索特定数据时使用子字符串。让我们通过几个例子来了解它是如何工作的 -
示例1
看看这个查询;它将获取“地址”字段为“delhi”的所有行。
from tinydb import Query student = Query() db.search(student['address'] == 'delhi')
它将产生以下输出-
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" } ]
示例2
在此查询中,我们对 search() 方法使用了稍微不同的语法。
from tinydb import Query student = Query() db.search(student.address.search('mumbai'))
它将获取“地址”字段为“孟买”的所有行。
[{ 'roll_number': 4, 'st_name': 'lakan', 'mark': 200, 'subject': 'MySQL', 'address': 'mumbai' }]
TinyDB - where 子句
TinyDB 提供了“where”子句,您可以在搜索特定数据时使用它。“where”子句有助于过滤掉不需要的数据。借助“where”子句,您可以快速访问特定数据。
在使用“where”子句之前,我们需要先导入它。“where”子句的语法如下-
from tinydb import where db.search(where('field') == 'value')
让我们借助几个示例来了解“where”子句的用法。
学生数据库
对于示例,我们将使用以下学生数据库。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
实施例1
让我们对主题字段使用“ where ”子句-
db.search(where('subject') == 'MySQL')
此查询将获取“主题”字段为“MySQL”的所有行。
[{ 'roll_number': 4, 'st_name': 'lakan', 'mark': 200, 'subject': 'MySQL', 'address': 'mumbai' }]
实施例2
让我们看看“ where ”子句与“不等于”条件的另一种用法 -
db.search(where('mark') != 275)
此查询将获取“mark”字段不等于“275”的所有行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" } ]
TinyDB -exists() 查询
TinyDB 提供了一个名为exists()的高级查询,用于检查JSON 文件中数据是否存在。contains ()查询实际上测试 JSON 文件中子字段数据的可用性。contains() 查询基于布尔条件进行工作。如果子字段存在(即BOOLEAN TRUE),它将从JSON文件中获取相应的数据,否则将返回空白值。
句法
TinyDB contains() 的语法如下 -
db.search(Query().field.exists())
这里,字段代表我们想要访问的数据部分。Query()是从 JSON 表Student创建的对象。
我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们对名为“ subject ”的字段使用 TinyDB contains()查询-
db.search(student.subject.exists())
此查询将获取所有行,因为所有行都有“主题”字段 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":" TinyDB ", "address":"benglore" } ]
实施例2
现在让我们对“地址”字段使用exists()查询-
db.search(student.address.exists())
它将获取以下行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":" TinyDB ", "address":"benglore" } ]
实施例3
现在,让我们尝试使用exists()查询不可用的字段 -
db.search(student.city.exists())
由于给定表中没有任何行具有名为“city”的字段,因此上面的 contains() 查询将返回空白值 -
[]
TinyDB - matches() 查询
matches() 查询将 JSON 文件中的数据与给定条件(以正则表达式的形式)进行匹配,并相应地返回结果。如果条件与文件中的数据不匹配,它将返回空白值。
句法
TinyDB matches()的语法如下 -
db.search(Query().field.matches(regular expression))
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。
让我们通过几个示例来了解它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看如何使用matches()进行完整项目搜索。
from tinydb import Query student = Query() db.search(student.st_name.matches('[aZ]*'))
此查询将获取所有行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
实施例2
让我们看看如何使用 matches() 进行区分大小写的搜索。
from tinydb import Query import re student = Query() db.search(student.st_name.matches('ram', flags=re.IGNORECASE))
此查询将获取学生姓名与字符串“ram”匹配的行。请注意,我们在匹配字符串时使用了一个标志来忽略大小写。
[{ 'roll_number': 2, 'st_name': 'Ram', 'mark': [250, 280], 'subject': ['TinyDB', 'MySQL'], 'address': 'delhi' }]
实施例3
让我们看看如何对特定项目使用 matches()。
student = Query() db.search(student.address.matches('keral'))
此查询将获取地址与字符串“keral”匹配的行。
[{'roll_number': 3, 'st_name': 'kevin', 'mark': [180, 200], 'subject': ['oracle', 'sql'], 'address': 'keral'}]
实施例4
让我们看看当没有找到特定项目时 matches() 会返回什么 -
student = Query() db.search(student.address.matches('Ratlam'))
没有“地址”字段与字符串“Ratlam”匹配的行,因此它将返回空白值 -
[]
TinyDB - test() 查询
test ()查询将测试给定的参数是否与表中的数据匹配。如果与数据匹配,则返回匹配的数据,否则返回空白。首先,我们需要定义一个测试函数及其参数,然后它将在给定数据库中搜索该项目。
句法
TinyDB test()的语法如下 -
db.search(Query().field.test(function or condition, *arguments))
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。
我们可以创建一个自定义测试函数,如下所示 -
object = lambda t: t == 'value'
这里,lamba关键字对于创建自定义测试函数非常重要。
让我们通过几个示例来了解它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
我们将首先创建一个测试函数,然后在我们的学生表中使用它 -
from tinydb import TinyDB, Query db = TinyDB('student.json') objects = lambda t: t == [250, 280] db.search(Query().mark.test(objects))
它将获取“mark”字段值为 [250, 280] 的行 -
[{'roll_number': 2, 'st_name': 'Ram', 'mark': [250, 280], 'subject': ['TinyDB', 'MySQL'], 'address': 'delhi'}]
实施例2
在此示例中,我们将在测试函数中使用“主题”字段 -
student = Query() db = TinyDB('student.json') objects = lambda t: t == 'TinyDB' db.search(student.subject.test(objects))
此查询将获取“subject”字段值为“TinyDB”的所有行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
TinyDB - any() 查询
为了搜索包含列表的字段,TinyDB 提供了一个名为any()的方法。此方法至少匹配数据库中的一个给定值。它根据提供的查询找到整个列表或最小一个值。
句法
TinyDB any ()的语法如下 -
db.search(Query().field.any(query|list)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。
如果我们提供查询作为any()方法的参数,它将匹配列表字段中至少有一个文档与给定查询匹配的所有文档。
另一方面,如果我们提供list作为any()方法的参数,它将匹配给定列表中至少存在列表字段中的一个文档的所有文档。
让我们通过几个示例来了解它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看如何从学生表中找到主题为 TinyDB、MySQL、SQL 或任意两个或三个的组合的字段 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().subject.any(['TinyDB', 'MySQL', 'oracle']))
上面的查询将获取“subject”字段包含以下任何值的所有行:“TinyDB”、“MySQL”或“oracle” -
[ { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" } ]
实施例2
让我们看看any()方法在与给定列表中的任何内容都不匹配时如何反应 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().subject.any(['Oracle']))
此查询将返回空白值,因为没有“主题”为“Oracle”的行。
[]
实施例3
请注意它区分大小写。“主题”字段没有“ Oracle ”,但有“ oracle ”。尝试以下查询 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().subject.any(['oracle']))
它将获取以下行 -
[{ 'roll_number': 3, 'st_name': 'kevin', 'mark': [180, 200], 'subject': ['oracle', 'sql'], 'address': 'keral' }]
由于它区分大小写,因此在上一个示例中返回空白值,因为没有“主题”为“Oracle”的行。
TinyDB - all() 查询
TinyDB 提供了一个名为all()的方法,该方法根据提供的查询查找整个值列表。让我们举一个例子来了解它是如何工作的。
句法
TinyDB all()的语法如下 -
db.search(Query().field.all(query|list)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。
如果我们提供一个查询作为all()方法的参数,它将匹配列表字段中的所有文档与给定查询匹配的所有文档。
另一方面,如果我们提供一个列表作为all()方法的参数,它将匹配列表字段中的所有文档都出现在给定列表中的所有文档。
让我们通过几个示例来了解它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看如何从学生表中找到主题为 TinyDB 和 MySQL 的字段 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().subject.all(['TinyDB', 'MySQL']))
此查询将获取以下行 -
[{ 'roll_number': 2, 'st_name': 'Ram', 'mark': [250, 280], 'subject': ['TinyDB', 'MySQL'], 'address': 'delhi' }]
实施例2
让我们看看如何使用all()从数据库中获取整个数据 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.all()
它将从链接数据库中获取所有行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
TinyDB - one_of() 查询
为了匹配子字段数据,TinyDB 提供了一个名为one_of()的方法。此方法搜索单个类别并获得至少一个相似值。如果该字段包含在提供的列表中,它将匹配。
句法
TinyDB one_of()的语法如下 -
db.search(Query().field.one_of(list)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。它将获取一个类别的单个或多个值。
让我们通过几个示例来了解它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看如何从学生表中找到地址为“delhi”或“pune”的字段-
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().address.one_of(['delhi', 'pune']))
它将获取“地址”字段包含“delhi”或“pune”的所有行。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" } ]
实施例2
让我们看另一个带有“主题”字段的示例 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(Query().subject.one_of(['TinyDB', 'MySQL']))
它将获取“主题”字段包含“TinyDB”或“MySQL”的所有行。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":4, "st_name":"lakhan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
TinyDB - 逻辑否定
逻辑非用作逆逻辑门。它将匹配与给定查询不匹配的文档。简单来说,它将显示给定命令的相反含义。
句法
TinyDB逻辑取反的语法如下 -
db.search(~(Query().field)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。它将获取代表给定命令相反含义的数据。
让我们举几个例子,看看它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看如何从学生表中找到学生姓名不为“ elen ”的字段-
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(~(Query().st_name == 'elen'))
上面的查询将获取学生姓名不是“elen”的所有行。
[ { "roll_number":2, "st_name":"Ram", "mark":[ 250, 280 ], "subject":[ "TinyDB", "MySQL" ], "address":"delhi" }, { "roll_number":3, "st_name":"kevin", "mark":[ 180, 200 ], "subject":[ "oracle", "sql" ], "address":"keral" }, { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
实施例2
让我们看看如何使用逻辑非来避免特定地址 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search(~(student.address.one_of(['keral', 'delhi'])))
此查询将获取“address”字段不包含“keral”或“delhi”的所有行。
[ { "roll_number":4, "st_name":"lakan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
TinyDB - 逻辑与
“逻辑与”运算符组合多个条件,如果满足所有条件,则计算结果为 True。TinyDB 逻辑 AND 对数据库的两个查询进行操作。如果两个查询都为 True,TinyDB 将获取所需的数据。另一方面,如果任何一个查询为 False,它将返回空白。
句法
TinyDB逻辑 AND的语法如下 -
db.search((Query().(query1) & (Query().(query2)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。如果两个条件都满足,它将获取数据,否则将返回空白。
让我们举几个例子来看看逻辑与是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看当我们在“st_name=lakhan”和“subject=MYSQL”字段上应用逻辑 AND 时,TinyDB Student 数据库会返回什么 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search ((Query().st_name == 'lakhan') & (Query().subject == 'MySQL'))
此查询将仅获取学生姓名为“lakhan”且“主题”为“MySQL”的行。
[{ 'roll_number': 4, 'st_name': 'lakhan', 'mark': 200, 'subject': 'MySQL', 'address': 'mumbai' }]
实施例2
在此示例中,让我们在“subject”和“roll_number”字段上应用逻辑 AND -
from tinydb import TinyDB, Query student = Query() db = TinyDB('student.json') db.search((student.subject.search('M')) & (student.roll_number < 5))
此查询将获取 roll_number 小于“4”且“subject”以字母“M”开头的所有行。
[{ 'roll_number': 4, 'st_name': 'lakhan', 'mark': 200, 'subject': 'MySQL', 'address': 'mumbai' }]
TinyDB - 逻辑或
“逻辑或”运算符组合多个条件,并且仅当满足其中一个条件时才计算结果为 True。TinyDB 逻辑 OR 对数据库的两个查询进行操作。如果任何一个查询为 True,TinyDB 将获取所需的数据。另一方面,如果两个查询都为 False,则返回空白。
句法
TinyDB逻辑或的语法如下 -
db.search((Query().(query1) | (Query().(query2)
这里,字段代表我们想要访问的数据部分。Query()是我们名为Student 的JSON 表创建的对象。如果满足任何一个条件,它将获取数据,否则将返回空白。
让我们举几个例子,看看它是如何工作的。我们将使用前面所有章节中使用的相同学生数据库。
实施例1
让我们看看当我们对“st_name”和“subject”字段应用逻辑或并检查以下条件时,TinyDB Student 数据库会返回什么:“st_name=lakhan”和“subject=TinyDB” -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search ((Query().st_name == 'lakan') | (Query().subject == 'TinyDB'))
此查询将获取以下行 -
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" }, { "roll_number":4, "st_name":"lakhan", "mark":200, "subject":"MySQL", "address":"mumbai" }, { "roll_number":5, "st_name":"karan", "mark":275, "subject":"TinyDB", "address":"benglore" } ]
实施例2
在此示例中,让我们对“subject”和“roll_number”字段应用逻辑或 -
from tinydb import TinyDB, Query db = TinyDB('student.json') db.search((student.subject.search('M')) | (student.roll_number < 5))
此查询将获取“主题”字段以字母“M”开头或“roll_number”小于“5”的所有行。
[ { "roll_number":1, "st_name":"elen", "mark":250, "subject":"TinyDB", "address":"delhi" },