大家好,我是木木。
今天给大家分享一个小巧的 Python 库,tinydb。
tinydb
tinydb 是一个纯 Python 的文档型小数据库,默认可以把数据存成 JSON,也能用内存存储做测试。它的查询表达式很直观,适合小脚本、插件配置、测试夹具和本地轻量数据。TinyDB 的优势是简单、可读、没有服务依赖;但它不是高并发数据库,也不适合海量数据和复杂事务。
项目地址:https://github.com/msiemens/tinydb
官方文档:https://tinydb.readthedocs.io/en/latest/
三大特点
纯 Python
没有服务进程,安装后就能用,适合小工具和教学示例。
查询直观
Query 和 where 表达式接近业务语言,过滤文档很顺手。
多表轻便
可以用 table 分隔不同类型数据,配置和状态不容易混在一起。
最佳实践
安装方式:pip install tinydb。
第一段代码解决的问题是:用内存 TinyDB 写入几条文档,并按字段查询管理员用户。
fromtinydbimportTinyDB,wherefromtinydb.storagesimportMemoryStoragefromimportlib.metadataimportversiondb=TinyDB(storage=MemoryStorage)db.insert_multiple([{"name":"Alice","role":"admin","points":18},{"name":"Bob","role":"user","points":9},{"name":"Cora","role":"user","points":21},])print("package:",version("tinydb"))print("total:",len(db))print("admins:",db.search(where("role")=="admin"))
第二段代码解决的问题是:组合查询和更新文档,适合小型状态管理。
fromtinydbimportQuery,TinyDBfromtinydb.storagesimportMemoryStoragedb=TinyDB(storage=MemoryStorage)db.insert_multiple([{"name":"Alice","role":"admin","points":18},{"name":"Bob","role":"user","points":9},{"name":"Cora","role":"user","points":21},])User=Query()print("top users:",[r["name"]forrindb.search((User.role=="user")&(User.points>=10))])db.update({"points":12},User.name=="Bob")print("bob:",db.get(User.name=="Bob"))
环境与版本信息
本文示例使用 Python 3.11,tinydb 4.8.2。示例采用 MemoryStorage,不写入真实文件。
高级功能
进阶一点看多表。把配置、用户、任务放进不同 table,可以让小项目结构更清楚。
fromtinydbimportQuery,TinyDBfromtinydb.storagesimportMemoryStoragedb=TinyDB(storage=MemoryStorage)settings=db.table("settings")settings.upsert({"name":"theme","value":"dark"},Query().name=="theme")settings.upsert({"name":"page_size","value":20},Query().name=="page_size")print("tables:",sorted(db.tables()))print("theme:",settings.get(Query().name=="theme")["value"])print("settings count:",len(settings))
适用场景
适合小脚本、本地配置、测试数据、插件状态、桌面小工具和不想引入服务型数据库的轻量场景。
不适用场景
不适合大量数据、高并发写入、复杂索引、跨进程强一致或需要权限控制的生产数据库场景。
上线检查
总结
tinydb 的好处就是小而直观。只要别把它当大数据库,它能让很多本地脚本少写不少样板代码。