Skip to content
🗂️ 文章分类: Python  
🏷️ 文章标签: Python  TinyDB  
📝 文章创建时间: 2024-08-01
🔥 文章最后更新时间:暂无

[toc]

Python使用TinyDB库笔记

TinyDB是一个轻量级的NoSQL数据库,适用于需要嵌入式数据库的小型项目。

它使用JSON文件存储数据,并提供了简单易用的API,支持多种查询和索引操作。

TinyDB非常适合那些不需要复杂数据库功能的小型应用,如配置管理、日志存储等。

安装

py
# 使用pip安装tinydb
pip install tinydb

基本操作

创建数据库和表

会在脚本所在目录中,创建一个数据库 json文件 用来存储数据。

py
# 导入tinydb库
from tinydb import TinyDB, Query

# 创建数据库 db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 删除表中所有数据
def clean_all():
    users_table.truncate()
  • TinyDB('db.json')方法可以创建数据库,也可以获取数据库对象。
  • db.table('users')方法可以创建表,也可以获取表对象。

插入数据

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 插入数据到表中
user_list = [
    {'name': 'jack', 'age': 12, 'city': 'New York'},
    {'name': 'tom', 'age': 22, 'city': 'New York'},
    {'name': 'mike', 'age': 32, 'city': 'New York'}
]
for user in user_list:
    table.insert(user)

# 或者可以批量插入数据
table.insert_multiple(user_list)

数据在数据库json文件中是以下面的格式存储的

json
{"users": {"1": {"name": "jack", "age": 12, "city": "New York"}, "2": {"name": "tom", "age": 22, "city": "New York"}, "3": {"name": "mike", "age": 32, "city": "New York"}}}

查询数据

一般使用Query对象进行数据查询。例如,查询所有名为jack的数据。

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 创建Query对象
query = Query()

# 条件查询名为jack的数据
result = table.search(query.name == "jack")
print(result)

## 运行结果如下
# [{'name': 'jack', 'age': 12, 'city': 'New York'}]

# 查询全部数据
all_data = user_table.all()
print(all_data)

更新数据

可以使用update方法更新表中的数据。

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 创建Query对象
query = Query()

# 更新数据。将名为jack的用户的年龄更新为31
table.update({'age': 31}, query.name == 'jack')

# 查询数据
result = table.search(query.name == "jack")
print(result)

## 运行结果如下
# [{'name': 'jack', 'age': 31, 'city': 'New York'}]

删除数据

可以使用remove方法删除表中的数据。例如,删除名为jack的数据。

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 创建Query对象
query = Query()

# 删除数据(先查询,再删除)
table.remove(query.name == 'jack')

清空数据库

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')

# 清空数据库的数据
db.truncate()

进阶操作

复杂查询

TinyDB支持复杂的查询条件和组合。例如,查询所有年龄大于25且居住在New York的用户。

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
table = db.table('users')

# 创建Query对象
query = Query()

# 查询名字为jack,并且年龄>30的数据
result = table.search((query.name == "jack") & (query.age > 30))
print(result)

# 查询名字为jack 或者 年龄>30的数据
result = table.search((query.name == "jack") | (query.age > 30))
print(result)

## 运行结果如下
# []
# [{'name': 'mike', 'age': 32, 'city': 'New York'}]

创建索引

TinyDB允许为字段创建索引,提高查询性能。

py
from tinydb import TinyDB, Query
# 创建数据库  db.json
db = TinyDB('db.json')
# 创建表
user_table = db.table('users')

# 插入数据到表中
user_table.insert({'name': 'jack', 'age': 12, 'city': 'New York'})

# 为user表中的name字段创建索引
user_table.create_index('name')

中文乱码

问题

一般情况下,使用tinydb存储中文数据的时候,json文件中存储的是中文对应的unicode编码。这使得json文件的数据可读性不好。

示例

py
from tinydb import TinyDB, Query
import json

# 创建数据库  db.json
db = TinyDB('db.json',encoding='utf-8')
# 创建表
table = db.table('t_user')

if __name__ == '__main__':

    # 清空表中数据
    table.truncate()
    # 用户数据
    userlist = [{'name': '小明11', 'pwd': 'a123456', 'idCard': 'XXXXXXX',
                 'remark': '焊接与热切割作业111'},
                {'name': '小明12', 'pwd': 'a123456', 'idCard': 'XXXXXXX',
                 'remark': '焊接与热切割作业222'}
                ]
    # 插入数据
    for user in userlist:
        table.insert(user)

    # 关闭数据库以确保所有数据写入文件
    db.close()

db.json文件中的数据如下所示

json
{"t_user": {"1": {"name": "\u5c0f\u660e11", "pwd": "a123456", "idCard": "XXXXXXX", "remark": "\u710a\u63a5\u4e0e\u70ed\u5207\u5272\u4f5c\u4e1a111"}, "2": {"name": "\u5c0f\u660e12", "pwd": "a123456", "idCard": "XXXXXXX", "remark": "\u710a\u63a5\u4e0e\u70ed\u5207\u5272\u4f5c\u4e1a222"}}}

可以看到中文被转换为unicode编码,并且文件中的json数据没有进行格式化处理。

解决方式

解决办法:我们可以把json文件中的数据读取出来,然后把unicode编码转换为中文,再次写入到json文件中。

例子

py
from tinydb import TinyDB, Query
import json

# 创建数据库  db.json
db = TinyDB('db.json',encoding='utf-8')
# 创建表
table = db.table('t_user')

if __name__ == '__main__':

    # 清空表中数据
    table.truncate()
    # 用户数据
    userlist = [{'name': '小明11', 'pwd': 'a123456', 'idCard': 'XXXXXXX',
                 'remark': '焊接与热切割作业111'},
                {'name': '小明12', 'pwd': 'a123456', 'idCard': 'XXXXXXX',
                 'remark': '焊接与热切割作业222'}
                ]
    # 插入数据
    for user in userlist:
        table.insert(user)

    # 关闭数据库以确保所有数据写入文件
    db.close()


    # 读取 TinyDB 数据库文件
    with open('db.json', 'r', encoding='utf-8') as file:
        data = json.load(file)

    # 写回 JSON 文件,确保中文不被转义
    with open('db.json', 'w', encoding='utf-8') as file:
        json.dump(data, file, ensure_ascii=False, indent=4)
  • 最下面的代码,是把json文件中的数据读取了一遍,然后再写入了一遍。在写入数据的过程中,把unicode编码转换为中文字符。
  • ensure_ascii=False 作用是将非 ASCII 字符转义为 Unicode 编码。设置为 False 时,中文等非 ASCII 字符将以原始字符输出,而不是转义为 Unicode 编码。
  • indent=4 作用是将 JSON 数据以 4 个空格的缩进格式输出,使其更具可读性。

db.json文件中的数据如下所示

json
{
    "t_user": {
        "1": {
            "name": "小明11",
            "pwd": "a123456",
            "idCard": "XXXXXXX",
            "remark": "焊接与热切割作业111"
        },
        "2": {
            "name": "小明12",
            "pwd": "a123456",
            "idCard": "XXXXXXX",
            "remark": "焊接与热切割作业222"
        }
    }
}

Released under the MIT License.