スポンサーリンク
はじめに
TinyDBでドキュメントを更新する場合、次のコードのように更新するディクショナリを指定すれば、勝手に同じキーがあれば更新、存在キーであれば追加してくれる。
db.update({'foo': 1, 'bar': "ABC"}, query.id == 100)
しかしながら、この方法の場合ではキーの追加・更新には対応していても、キーを削除したいシーンには対応できない。
さらに、ドキュメントの値をインクリメント/デクリメントしたいケースでは、一度、更新対象ドキュメントを取得し値を加算 or 減算した後に、再度ドキュメントを更新する必要があり不便である。
tinydb.operations
前述の問題を解決するために、TinyDBではtinydb.operations
モジュールにドキュメントの更新操作を行うための操作が付属している。
delete(key)
:ドキュメントからキーを削除しますincrement(key)
:キーの値をインクリメントしますdecrement(key)
:キーの値をデクリメントしますadd(key, value)
:value
の値だけキーの値を加算します(文字列の場合は文字連結)subtract(key, value)
:value
の値だけキーの値から減算するset(key, value)
:キーの値にvalue
を設定する
次のサンプルデータを元に、tinydb.operations
モジュールの各操作を行うサンプルコードを確認していきましょう。
# サンプルデータ
db.insert({"id": 100, "name": "Yamada", "score": 80})
キーの削除 | delete
delete
は、ドキュメントからキーを削除する操作です。
次の例では、キー「score」を削除する場合は次のように書きます。
from tinydb.operations import delete
db.update(delete('score'), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada'}]
インクリメント | increment
increment
はキーの値をインクリメントする操作です。
次の例では、キー「score」の値をインクリメントしています。
from tinydb.operations import increment
db.update(increment('score'), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada', 'score': 81}]
デクリメント | decrement
decrement
は、increment
とは逆にキーの値をデクリメントするための操作です。
次の例では、キー「score」の値をデクリメントしています。
from tinydb.operations import decrement
db.update(decrement('score'), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada', 'score': 79}]
加算 | add
add
は、指定した値をキーの値を加算します。値が文字列の場合は、指定した値がキーの値の末尾に連結されます。
次の例では、キー「score」の値に 100を加算しています。
from tinydb.operations import add
db.update(add('score', 100), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada', 'score': 180}]
さらに次の例では、文字列項目のキー「name」の値に "Tarou"を加算(連結)しています。
from tinydb.operations import add
db.update(add('name', "Tarou"), query.id == 100)
実行結果
[{'id': 100, 'name': 'YamadaTarou', 'score': 80}]
減算 | subtract
subtract
は、指定した値をキーの値から減算します。
次の例では、キー「score」の値から 50を減算しています。
from tinydb.operations import subtract
db.update(subtract('score', 50), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada', 'score': 30}]
add
操作とは違い、値が文字列のキーに対し、subtract
で操作を行うと次のようなエラーが発生するので注意しましょう。
TypeError: unsupported operand type(s) for -=: 'str' and 'str'
値の設定 | set
set
は、キーに指定した値を設定する操作です。
次の例では、キー「name」の値を"Suzuki"で置き換えています。
from tinydb.operations import set
db.update(set('name', "Suzuki"), query.id == 100)
実行結果
[{'id': 100, 'name': 'Suzuki', 'score': 80}]
スポンサーリンク
独自の更新操作を定義する
tinydb.operations
モジュールに目的の操作がない場合、独自の更新操作を定義することも可能です。
次のコードは、rank_operation
という独自の操作を定義し、pass_score
で渡された合格点以上であれば “合格”、それ以下であれば "不合格"をドキュメントのjudge
に更新する操作を定義する例です。
def rank_operation(pass_score):
def transform(doc):
if doc["score"] >= pass_score:
doc["judge"] = "合格"
else:
doc["judge"] = "不合格"
return transform
db.update(rank_operation(pass_score=70), query.id == 100)
実行結果
[{'id': 100, 'name': 'Yamada', 'score': 80, 'judge': '合格'}]
まとめ
TinyDBのtinydb.operations
を使って、キーの削除、インクリメント、デクリメント、加算、減算、値の設定を行う方法と、独自の更新操作を定義する方法を解説してきました。
TinyDBは軽量でありながら柔軟な操作が行え、これ以外にも便利な関数が多くあるのでどんどん調べていきたいですね。
0 件のコメント:
コメントを投稿