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 支持字典格式的数据插入。可以使用 insert
或 insert_multiple
方法来插入单条或多条数据。
python"># 插入单条数据
db.insert({'name': 'Alice', 'age': 30})# 插入多条数据
db.insert_multiple([{'name': 'Bob', 'age': 25},{'name': 'Charlie', 'age': 35}
])
{"_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 依然是一个不错的选择,但如果并发要求较高,建议考虑使用其他数据库系统。