あれもPython,これもPython

Pythonで世界を包みたい

Pythonでmongoやjsonの代わりにtinydbを使う

tinydbはmongodbのようなドキュメント型データベースです。
特徴として、mongoのようにサーバーを立てる必要がありません。

web APIを叩いたりしていると、
jsonファイルを楽に扱えたらなあ、と思うことがあります。

また、簡単なプロトタイプアプリを作る場合、
データスキーマを決めたくない場合があります。

tinydbはjsonファイルとドキュメントデータベースの中間のようなデータベースです。
基本はjsonファイルですが、
サーチやインサートなどDBライクに操作でき便利です。

導入

pip install tinydb

使ってみる

テーブルは作成しなくても大丈夫です。
勉強のため、テーブル作成をやってみます。

from tinydb import TinyDB
db = TinyDB("db.json")
# インメモリーで使いたい時は
# from tinydb.storages import MemoryStorage
# db = TinyDB(stroage = MemoryStorage)

table = db.table('new_table')

table.insert({"data":"value"})
table.all()
#[{"data":"value"}]

# テーブルを全て消す
db.purge_tables()

データの作成

基本的には辞書型をinsertするだけです。
しかし、複数の辞書をいっぺんに投入したい場合があります。
当然forで回してインサートではなく、
マルチプルインサートしましょう。
(速度が圧倒的に違う)

from tinydb import TinyDB
db = TinyDB("db.json")

# 一つのみ
db.insert(辞書データ)

# 複数
db.insert_multiple([辞書データ,辞書データ・・・])

注意点として、リストの中に辞書型以外があってもインサートできてしまいます。
こんなの=>[{},0,{}]
しかし、辞書以外が混ざるとエラーでdbが開けなくなります。

データの検索

クエリオブジェクトを使って行えます。
いちいち、メモリに展開する記述がいらないので非常に楽です。

from tinydb import TinyDB,Query
db = TinyDB("db.json")
qwy = Query()

# 全て
db.all()

db.search(qwy.データのアトリビュート=='検索値')
# {k1:{k2:value}}みたいなデータのvalueが欲しい時は
# qwy.k1.k2 == valueでアクセス可能
# qwy[k1][k2]とかも可能

更にqwy.アトリビュート.match(正規表現)
qwy.アトリビュート.search(正規表現)で、
正規表現を使用できます。

リスト内の値で検索する場合({k:[1,2,3]}みたいな場合)
qwy.k.any([検索値のリスト])で一つでも引っかかれば返せます。
(anyではなくallにすると全一致になります)

データの更新

更新、削除も簡単です。

# 更新
db.update({更新したいkey:更新後のvalue},qwr.アトリビュート==値)
# update set 更新したいkey = 更新後のvalue where アトリビュート == 値;と同じ

# 削除
db.remove(qwr.アトリビュート==値)