【TinyDB】玩数据

TinyDB -数据处理

1、新增字段

一次增加一条: insert({'for':'bar'}) 

一次增加多条: insert_mutiple([{...},{...},...]) 

2、更新字段

对已经存在的字段进行数据处理。有1+6+X 种方法:

1: update({key:value})

6: update(tinydb_func(key或者key,value),query)

*** tinydb_func是便于理解,不是真的存在的函数。6种如下:

   #  delete(key):删除key对应的键值对

   #  increment(key):key对应的value +1,仅数字

   #  decerement(key):key对应的value -1,仅数字

   #  add(key, val):key对应的value + val,可以操作字符串

   #  subtract(key, val):key对应的value - val, 仅数字

   #  set(key, val):设置key的value = value,任意类型

from tinydb import TinyDB
from tinydb import Query

db = TinyDB('data.json')
db.insert_multiple([
    {'name':'a'},
    {'name':'b'},
    {'name':'c'},
    {'name':'d'},
    {'name':'e'},
    {'name':'f'},
])
print(db.all())  # 
db.update({'age':10})
print(db.all())  # 每个字段里面都增加了同样的新键值对
# [{'name': 'a', 'age': 10}, {'name': 'b', 'age': 10},
  {'name': 'c', 'age': 10}, {'name': 'd', 'age': 10},
{'name': 'e', 'age': 10}, {'name': 'f', 'age': 10}]
from tinydb.operations import delete from tinydb.operations import increment,decrement from tinydb.operations import add, subtract, set User = Query() db.update(delete('age'),User.name == 'a') # {'name': 'a'} -->直接删除了'age':10 db.update(increment('age'), User.name == 'b') # {'name': 'b', 'age': 11} -->10+1 db.update(decrement('age'), User.name == 'c') # {'name': 'c', 'age': 9} -->10-1 db.update(add('age',5), User.name == 'd') # {'name': 'd', 'age': 15} -->10+5 db.update(subtract('age',5), User.name == 'e') # {'name': 'e', 'age': 5} -->10-5 db.update(set('age',100), User.name == 'f') # {'name': 'f', 'age': 100} -->100 for filed in db.all(): print(filed)

X:自定义方法,可以按照下面的格式要求写自己的逻辑:

def my_func(args):
    def transform(doc):  #这两行不要改
        # 业务逻辑
        # ...
    return transform     #这两行不要改
db.update(my_func(args),query)

 3、更新插入

 更新数据后再插入,直接使用 update({...},query) 

db.upsert({'name':'a','logger-in': True}, User.name == 'a')
db.upsert({'name':'b','age': 200},User.name == 'b')

4、获取数据

  len( db) :获取表的长度,返回里面有多少个字段,或者doc--> { ... }

  db.get( query) :返回符合 query条件的字段 { ...},这里和search不一样,search返回是字段列表[ { ... } , { ... } ]

  db.contains( query) :判断包含有 符合 query条件的字段存在,返回True 和 False

  db.count( query) :返回符合条件的字段数量

a = len(db)
b = db.get(User.name == 'a')
c = db.contains(User.name == 'a')
d = db.count(User.name == 'a')
print(a) #11
print(b) # {'name': 'a', 'logger-in': True}
print(c) #True
print(d) # 1

5、替换数据

 对现有的字段进行替换用: write_back(doc) 

这里的doc通过print()打印出来都是字典的样子,但是它比字典了下多了 .doc_id 的属性。

from tinydb import TinyDB,Query
# 初始化一个TinyDB文件,生成json文件
db = TinyDB('test_write.json')
db.insert_multiple({'name':'a','age':i} for i in range(5))

User = Query()
docs = db.search(User.name == 'a')
db.write_back(docs)  # 将新的字段写入到json文件。
print(db.all())

运行结果:

[{'name': 'a', 'age': 100}, 
{'name': 'a', 'age': 100}, 
{'name': 'a', 'age': 100}, 
{'name': 'a', 'age': 100},
{'name': 'a', 'age': 100}]

可以尝试用下面的例子去试下 write_back() 方法。

doc_new = {'name':'aaa','age':111}
db.write_back(doc_new)

报错:AttributeError: 'str' object has no attribute 'doc_id'

 

for doc in docs:
    print(doc.doc_id) #1、2、3、4、5

所以, white_back() 操作的是带有 doc_id 属性的某个对象,而不能直接对字典形式的字段进行写入,要写就用 insert() 。

6、记住这种表

Inserting data
db.insert_multiple(...) Insert multiple documents
Updating data
db.update(operation, ...) Update all matching documents with a special operation
db.write_back(docs) Replace all documents with the updated versions
Retrieving data
len(db) Get the number of documents in the database
db.get(query) Get one document matching the query
db.contains(query) Check if the database contains a matching document
db.count(query) Get the number of matching documents

 

上一节:TinyDB(查询)

下一节:TInyDB(其他知识点)

 

posted @ 2020-03-02 20:22  王大桃zzZ  阅读(2005)  评论(0编辑  收藏  举报