数据库tinydb
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 的表(包括所有数据)
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果