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(其他知識點)