軽量NoSQLデータベースの TinyDB

2021年3月30日火曜日

Python

t f B! P L

TinyDBは、Pythonで使える軽量な NoSQLです。

OSにデータベース・エンジンをインストールする必要もなく、pipで TinyDBのライブラリをインストールすれば単体で動作し、データも1つの JSONファイルに保存されるため扱いも容易です。

TinyDBのインストール

pipでインストール

$ pip install tinydb

Anacondaでインストール

$ conda install -c conda-forge tinydb

データベースの初期化

最初に必要なモジュールをインポートします。
次に、データベースのファイル名を指定してTinyDBのインスタンスを作成します。

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

上のコードを実行すると、カレントディレクトリに`db.json`ファイルが作成されます。TinyDBではデータをJSONファイルで管理します。

ドキュメントの追加

ドキュメントはinsert関数で追加できます。ドキュメントはRDBで言うところのレコードのイメージです。

db.insert({"id": 100, "name": "山田", "age": 10})
db.insert({"id": 110, "name": "鈴木", "age": 50})

上のコードを実行すると、データベースのJSONファイル(db.json)に次のような内容が書き込まれ、追加したドキュメントが保存されます。

{
    "_default": {
        "1": {
            "id": 100,
            "name": "山田",
            "age": 10
        },
        "2": {
            "id": 110,
            "name": "鈴木",
            "age": 50
        }
    }
}

複数ドキュメントをまとめて追加

まとめて複数のドキュメントを追加する場合はinsert_multiple関数を使います。

db.insert_multiple([
 {"id": 100, "name": "山田", "age": 10},
 {"id": 110, "name": "鈴木", "age": 50}])

ドキュメントの削除

Queryインスタンスで削除条件を指定してドキュメントを削除します。

query = Query()
db.remove(query.id == 100)

全ドキュメントの削除

データベース内の全ドキュメントを削除する場合は、truncate関数を使用します。

db.truncate()

ドキュメントの更新

更新はupdate関数で行います。1つ目の引数に更新する内容、2つ目の引数に更新するドキュメントの条件をクエリで指定します。

query = Query()
db.update({"age": 30, "address": "TOKYO"}, query.id == 100)

上のコードを実行すると、`id`属性が「100」のドキュメントが指定した値で更新されます。更新前に存在しなかった`address`属性は追加されます。
{
    "_default": {
        "1": {
            "id": 100,
            "name": "山田",
            "age": 30,
            "address": "TOKYO"
        },
        "2": {
            "id": 110,
            "name": "鈴木",
            "age": 50
        }
    }
}

キーの削除

ドキュメント内の一部のキー(属性)を削除する場合は、deleteフィールドに削除したいキーを指定してupdate関数の引数に渡します。

from tinydb import TinyDB, Query
from tinydb.operations import delete

query = Query()
db.update(delete('age'), query.id == 100)

コードを実行すると次のような結果になります。
id=100のドキュメントからageキーが作成されているのが分かります。

{
    "_default": {
        "1": {
            "id": 100,
            "name": "山田"
        },
        "2": {
            "id": 110,
            "name": "鈴木",
            "age": 50
        }
    }
}

テーブルで複数の情報を管理

TinyDBでは「テーブル」を複数作成できます。RDBでもテーブルを分けて必要すると思いますが、それと同じ感覚です。

以下は、ユーザー情報と、テストのスコアを管理するテーブルを作成し、それぞれのテーブルにドキュメントを追加するサンプルコードです。

tbl1 = db.table('users')
tbl1.insert({"id": 100, "name": "山田", "age": 10})
tbl1.insert({"id": 110, "name": "鈴木", "age": 50})

tbl2 = db.table('scores')
tbl2.insert({"id": 100, "subject": "数学", "score": 80})
tbl2.insert({"id": 100, "subject": "国語", "score": 60})
tbl2.insert({"id": 110, "subject": "数学", "score": 100})

このコードを実行すると、DBのJSONファイルには次のように書き込まれます。
{
    "users": {
        "1": {
            "id": 100,
            "name": "山田",
            "age": 10
        },
        "2": {
            "id": 110,
            "name": "鈴木",
            "age": 50
        }
    },
    "scores": {
        "1": {
            "id": 100,
            "subject": "数学",
            "score": 80
        },
        "2": {
            "id": 100,
            "subject": "国語",
            "score": 60
        },
        "3": {
            "id": 110,
            "subject": "数学",
            "score": 100
        }
    }
}

特にテーブル名を指定しない場合、TinyDBでは `_default`という名前のテーブルが使用され、データベースオブジェクトに対して行われた操作は `_default`テーブルに格納されます。

そもそも、TinyDBはデータを1つのJSONファイルで管理するため、テーブルで分けるのではなく、ファイル自体を分けてすべて _defaultテーブルを使うのも1つの手ですね。

テーブル一覧の取得

データベース内のすべてのテーブルの名前を含むリストを取得できます。

db.tables()

テーブルの削除

データベースから指定した名前のテーブルを削除するには、drop_table関数を使います。

db.drop_table('table_name')

すべてのテーブルを削除する場合は`drop_tables()`関数を使用します。
db.drop_tables()
スポンサーリンク

QooQ