Python轻量级NoSQL数据库TinyDB

https://github.com/msiemens/tinydb

TinyDB 是一个纯 Python 实现的嵌入式 NoSQL 数据库,适用于存储小型数据集合,尤其适合用于轻量级应用、个人项目或原型开发。

一、安装

python 复制代码
pip install tinydb

二.基本操作

1.创建和初始化数据库

python 复制代码
from tinydb import TinyDB

# 创建一个数据库(文件名为 db.json)
db = TinyDB('db.json')

2. 插入数据

TinyDB 支持字典格式的数据插入。可以使用 insertinsert_multiple 方法来插入单条或多条数据。

python 复制代码
# 插入单条数据
db.insert({'name': 'Alice', 'age': 30})

# 插入多条数据
db.insert_multiple([
    {'name': 'Bob', 'age': 25},
    {'name': 'Charlie', 'age': 35}
])
json 复制代码
{
    "_default": {
        "1": {
            "name": "Alice",
            "age": 30
        },
        "2": {
            "name": "Bob",
            "age": 25
        },
        "3": {
            "name": "Charlie",
            "age": 35
        }
    }
}

3. 查询数据

查询通过 Query 类来构建查询条件。

python 复制代码
from tinydb import Query

# 创建一个查询对象
User = Query()

# 查询 name 为 Alice 的记录
result = db.search(User.name == 'Alice')

# 查询 age 大于 30 的记录
result = db.search(User.age > 30)

print(result)

4. 更新数据

你可以使用 update 方法来更新数据。更新操作是基于查询结果执行的。

python 复制代码
# 更新 Alice 的年龄为 31
db.update({'age': 31}, User.name == 'Alice')

# 批量更新
db.update({'age': 40}, User.age < 30)

5. 删除数据

删除数据的操作也非常简单,可以使用 remove 方法删除符合条件的记录。

python 复制代码
# 删除 name 为 Bob 的记录
db.remove(User.name == 'Bob')

# 删除所有 age 小于 30 的记录
db.remove(User.age < 30)

6. 排序和分页

TinyDB 提供了基本的排序功能。可以使用 order_by 方法来对查询结果进行排序:

python 复制代码
# 按年龄升序排序
result = db.all()  # 获取所有记录
sorted_result = sorted(result, key=lambda x: x['age'])

print(sorted_result)

7. 数据库备份和恢复

TinyDB 数据库是存储在 JSON 文件中的,可以很容易地备份或恢复。只需要简单的复制文件即可实现。

python 复制代码
import shutil

# 备份数据库
shutil.copy('db.json', 'db_backup.json')

# 恢复数据库
shutil.copy('db_backup.json', 'db.json')

三、高级使用

1. 使用不同的存储方案

TinyDB 支持多种存储方案,默认使用的是 JSONStorage。你还可以使用 MemoryStorage 来改变数据的存储方式。

python 复制代码
from tinydb.storages import JSONStorage

# 使用默认存储
db = TinyDB('db.json', storage=JSONStorage)

2. 支持嵌套数据

TinyDB 支持存储嵌套的数据结构,可以是字典、列表等。例如:

python 复制代码
db.insert({
    'name': 'David',
    'address': {
        'city': 'New York',
        'zip': '10001'
    }
})

你可以通过查询嵌套字段进行过滤:

python 复制代码
result = db.search(User.address['city'] == 'New York')

3. 使用 Index

TinyDB 也支持为字段创建索引,从而加速查询。使用索引时,可以显著提高查询性能,特别是当数据量增加时。

python 复制代码
# 创建索引
db.create_index(['name'])

# 查询时使用索引
result = db.search(User.name == 'Alice')

总结

TinyDB 在单线程环境中非常轻便和易用,但在多线程环境下需要特别小心。使用线程锁来保证每次只有一个线程对数据库进行操作,是避免数据冲突和写入混乱的关键。在并发较低的小型项目中,TinyDB 依然是一个不错的选择,但如果并发要求较高,建议考虑使用其他数据库系统。

相关推荐
收破烂的小熊猫~6 分钟前
《Java修仙传:从凡胎到码帝》第四章:设计模式破万法
java·开发语言·设计模式
蹦蹦跳跳真可爱58931 分钟前
Python----OpenCV(图像増强——高通滤波(索贝尔算子、沙尔算子、拉普拉斯算子),图像浮雕与特效处理)
人工智能·python·opencv·计算机视觉
nananaij36 分钟前
【Python进阶篇 面向对象程序设计(3) 继承】
开发语言·python·神经网络·pycharm
雷羿 LexChien42 分钟前
从 Prompt 管理到人格稳定:探索 Cursor AI 编辑器如何赋能 Prompt 工程与人格风格设计(上)
人工智能·python·llm·编辑器·prompt
阿蒙Amon1 小时前
为什么 12 版仍封神?《C# 高级编程》:从.NET 5 到实战架构,进阶者绕不开的必修课
开发语言·c#
无小道1 小时前
c++-引用(包括完美转发,移动构造,万能引用)
c语言·开发语言·汇编·c++
爱莉希雅&&&1 小时前
技术面试题,HR面试题
开发语言·学习·面试
敲键盘的小夜猫1 小时前
LLM复杂记忆存储-多会话隔离案例实战
人工智能·python·langchain
开开心心_Every2 小时前
便捷的Office批量转PDF工具
开发语言·人工智能·r语言·pdf·c#·音视频·symfony
高压锅_12202 小时前
Django Channels WebSocket实时通信实战:从聊天功能到消息推送
python·websocket·django