from tinydb import TinyDB, Query
db = TinyDB(
"db.json", ensure_ascii=False, indent=2, encoding="utf-8"
)
User = Query()
user_tbl = db.table('users')  # 新建一个表,不写用默认的表
db.all()           # 全部文档
db.count(cond)     # 条件计数
db.contains(cond)  # 存在返回 True

多表(Table)用法

user_tbl = db.table('users')      # 若表不存在则自动创建
cfg_tbl  = db.table('config')     # 同一 json 文件可存多张表

插入

# 单条
db.insert({'name': 'Alice', 'age': 18})

# 批量
db.insert_multiple([
    {'name': 'Bob',   'age': 22},
    {'name': 'Cathy', 'age': 33}
])

# 指定表插入
users = db.table('特定表') 
users.insert({'name': 'Tom', 'age': 18})

更新

from tinydb import Query
User = Query()
# 直接覆盖字段
db.update({'age': 19}, User.name == 'Alice')

# 自增
db.update(lambda x: {'age': x['age'] + 1}, User.name == 'Bob')

# upsert:存在则更新,不存在则插入
db.upsert({'name': 'Tom', 'age': 20}, User.name == 'Tom')

from tinydb.operations import set, delete, add
# 设置字段
db.update(set('age', 30), User.name == 'Alice')

# 删除某个字段(如去掉 email 字段)
db.update(delete('email'), User.name == 'Alice')

# 对数字字段累加
db.update(add('age', 1), User.name == 'Alice')

# 按id更新
db.update({'age': 28}, doc_ids=[1, 2, 3])

查询(含正则)

import re

# 全部
all_docs = db.all()
# 单条
db.get(User.name == 'Alice')

# 多条
db.search(User.age > 18)

# 正则:名字以 A 开头,忽略大小写
db.search(User.name.matches(r'^A.*', flags=re.IGNORECASE))

# 包含子串
db.search(User.desc.contains('python'))

# 组合条件:& 表示 AND,| 表示 OR,~ 表示 NOT 
res = db.search((User.age >= 18) & (User.age <= 30)) 
res = db.search((User.name == 'Alice') | (User.name == 'Bob')) 
res = db.search(~(User.age < 18))

# 自定义函数
db.search(lambda x: x['age'] % 2 == 0)

# 通过 doc_id 获取
doc = db.get(doc_id=1)

# 是否存在
exists = db.contains(User.name == 'Alice')   # True / False
exists_by_id = db.contains(doc_id=1)

# 统计数量
count_all = len(db)                       # 所有文档数量
count_25 = db.count(User.age >= 25)       # 条件计数

删除

# 删除所有 age < 18 的用户
db.remove(User.age < 18)

# 删除 name 为 'Bob' 的文档
db.remove(User.name == 'Bob')

# 按id删除
db.remove(doc_ids=[1, 2])

# 清空整张表
db.truncate()                 # 清空当前表(默认表)
users = db.table('users')
users.truncate()              # 清空指定表

# 删除整个表
db.drop_table('users')        # 删除名为 users 的表(包括所有数据)