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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM