Python3 - TinyDBの使いかた。手軽にマイクロデータベースを扱う方法

2019-04-05 22:55:45 782

はじめに

TinyDBは、ファイルベースでかつシステマティックなマイクロデータベースのライブラリです。
個人的には、pickleとかよりも数万倍使いやすいと感じていて、SQLなど使うまでもないようなデータの管理に重宝しています。

というか、これ以外使いたくねーw

インストール

pip install tinydb

一連のテストプログラム

使ってみる

from tinydb import TinyDB, where

#データベースを定義
'''
指定したファイル名が存在しない場合、自動で作成される。
'''
DB = TinyDB('sample.dat')

#データを書き込む
nums = [10,20,30]
for num in nums:
#辞書型でデータを作成
data = {'pid':num}
#すでにpidが同じデータが存在しないかチェック
if DB.search(where('pid')==num):
#すでに存在していれば、updateでそのデータを上書き
DB.update(data, where('pid')==num)
else:
#なければ、新しくデータを追加
DB.insert(data)

#データを読み込む
'''
ファイルをエディタで読み込むと、以下のような構成になっている。
{"_default": {"1": {"pid": 10}, "2": {"pid": 20}, "3": {"pid": 30}}}
'''
allData = DB.all() #すべてのデータをリストで取得
#>>>[{'pid': 10}, {'pid': 20}, {'pid': 30}]
getData = DB.get(where('pid')==10) #データを一つだけ探す
#>>>{'pid': 10}
searchData = DB.search(where('pid')==10) #一致するものをすべてリストで取得s
#>>>[{'pid': 10}]
eid = getData.eid #{"1": {"pid": 10}の"1"がeid
#>>>1

#データを消去する
DB.remove(eids=[eid])
#>>>[{'pid': 20}, {'pid': 30}]
DB.remove(where('pid')==20)
#>>>[{'pid': 30}]
DB.purge() #データを全てリセット

解説

まずは、データベースを作成します。
存在しないファイル名を指定しても、自動で作成してくれるため、非常に簡単。

TinyDBの使い方

from tinydb import TinyDB, where

#データベースを定義
'''
指定したファイル名が存在しない場合、自動で作成される。
'''
DB = TinyDB('sample.dat')

次にデータを書き込んでみます。

データ書き込み

#データを書き込む
nums = [10,20,30]
for num in nums:
#辞書型でデータを作成
data = {'pid':num}
#すでにpidが同じデータが存在しないかチェック
if DB.search(where('pid')==num):
#すでに存在していれば、updateでそのデータを上書き
DB.update(data, where('pid')==num)
else:
#なければ、新しくデータを追加
DB.insert(data)

ここで、searchは、一致するデータをリスト型で返します。
リストが存在すれば、updateで、上書き指令を出しています。
リストが存在しなければ、insertで新たにデータを挿入します。

データを読み込む

#データを読み込む
'''
ファイルをエディタで読み込むと、以下のような構成になっている。
{"_default": {"1": {"pid": 10}, "2": {"pid": 20}, "3": {"pid": 30}}}
'''
allData = DB.all() #すべてのデータをリストで取得
#>>>[{'pid': 10}, {'pid': 20}, {'pid': 30}]
getData = DB.get(where('pid')==10) #データを一つだけ探す
#>>>{'pid': 10}
searchData = DB.search(where('pid')==10) #一致するものをすべてリストで取得s
#>>>[{'pid': 10}]
eid = getData.eid #{"1": {"pid": 10}の"1"がeid
#>>>1

.allですべてのデータをlist型で取得する。
getは、条件に一致する1つのデータをdict型で取得する。
searchは、条件に一致するすべてのデータをlist型で取得する。
取得したデータは、.eidで固有の番号を取得することができる。データは全く同じでも、insertで追加に書き込まれていれば、必ずeidは異なる。


データを消去する

DB.remove(eids=[eid])
#>>>[{'pid': 20}, {'pid': 30}]
DB.remove(where('pid')==20)
#>>>[{'pid': 30}]
DB.purge() #データを全てリセット

removeで指定したデータを消すことができる。
すべてのデータを消す場合は、purgeをつかう。

以上で、一通りの使い方ができるので、なんでもできると思う。

TinyDBはその名の通り、Tinyでありながらもものすごい使い勝手の良さを発揮して、Memoryにデータを保管することもできる。

検索系応用

リスト内や複数条件の検索

DB.insert({'name': 'hoge', 'groups': ['admin', 'user']})
DB.insert({'name': 'huga', 'groups': ['user']})
#groupsにadminが含まれているデータを抽出 DB.search(where('groups').any('admin') #>>>[{'name': 'hoge', 'groups': ['user','admin']}]
#groupsにadminかつnameがuserのデータを抽出
DB.search((where('groups').any('admin')) & (where('name')=='user'))

#groupsにadminまたはnameがuserのデータの数をカウント
DB.count((where('groups').any('admin')) | (where('name')=='user'))
#>>>1

関連記事