TinyDB でキー(属性)の削除やインクリメント・デクリメントする(tinydb.operations)

2021年4月2日金曜日

Python TinyDB

t f B! P L

スポンサーリンク

はじめに

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は軽量でありながら柔軟な操作が行え、これ以外にも便利な関数が多くあるのでどんどん調べていきたいですね。

スポンサーリンク

QooQ