MicroPython的午睡(109) ESP32版、btreeモジュールで連想配列永続化?

Joseph Halfmoon

フルPython処理系でデータベース的なものを使いたいとき「お手軽な」SQLite使うことが多いデス。一方スタンドアロンなMicroPython単独でSQL系DB使うのは現実的ではないかと。しかしMicroPythonには固有の実装としてbtreeモジュールあり、標準辞書型に近い形の連想配列を「永続化」可能であります。

※「MicroPython的午睡」投稿順 Indexはこちら

BTreeデータベース

BTreeはキー/バリュー型のデータベースです。この方が下手にリレーショナル・データベースを使うよりPythonのネーチャーにはあっているかと(個人の感想です。)詳細についてはいつもお世話になっているMicroPythonの日本語ドキュメントから以下のページをご参照くだされ。

btree — 単純な BTree データベース

プログラミング上はPython標準の辞書型(連想配列)とクリソツなのですが、以下の相違があります。

    1. 使う前にオープン、使い終わったらクローズが必要
    2. キー、バリューともbytes型(ライク)なバイトデータの連なりでなければならない

オープン、クローズする先をMicroPythonに漏れなくついてくる筈のFlash上のファイルシステムに向けておけば、プログラムの実行を終えて電源をOFFにしてもデータの記憶は「永続化」され、電源ONしてプログラムでオープンすれば読み出せると。なお、Flashに向けずメモリオブジェクトに向けることもできるみたいっす(やってないケド。)

データ書き込みテスト用のスクリプト

以下、ESP32_BtreeStore.py と名付けたスクリプトです。Flashストレージ上にtest.dbなるファイルを生成し、そこに2件のキー/バリュー・データ対を書き込みます。

import btree

def openDB(fnam):
    try:
        f = open(fnam, "r+b")
    except OSError:
        f = open(fnam, "w+b")
    return f

def main():
    print("ESP32, store btree test data.")
    fil = openDB("test.db")
    db = btree.open(fil)
    
    db[b"key1"] = b"data1"
    db[b"key2"] = b"data2"
    db.flush()
    db.close()
            
if __name__ == "__main__":
    main()
データ読み出しテスト用のスクリプト

以下、ESP32_BtreeLoad.py と名付けたスクリプトです。上のスクリプトで生成した、test.dbなるファイルを開いて、過去込まれているハズのキー/バリュー・データ対を読み出して標準出力に書き出すもの。

import btree

def openDB(fnam):
    try:
        f = open(fnam, "r+b")
    except OSError:
        f = open(fnam, "w+b")
    return f

def main():
    print("ESP32, load btree test data.")
    fil = openDB("test.db")
    db = btree.open(fil)
    
    print(db[b"key1"])
    print(db[b"key2"])
    db.close()
            
if __name__ == "__main__":
    main()
動作確認

まず、ESP32_BtreeStore.pyを走らせて test.db にキー/バリュー対を書き込んだ上で、ESP32_BtreeLoad.pyを走らせたところが以下に。ESP32_Python_Btree_EC

device側のMicroPythonストレージに test.db なるファイルが生成されおり、また、2件のデータが読み出せていることが分かります。良かった。

今回は、単純なデータの扱いだったけれども、もっと複雑な構造のデータの永続化もやった方が良いな。また次回か。

MicroPython的午睡(108) ESP32版、「自前制作」タッチセンサをセンス へ戻る

MicroPython的午睡(110) ESP32版、btree + json が一番お楽? へ進む