フルPython処理系でデータベース的なものを使いたいとき「お手軽な」SQLite使うことが多いデス。一方スタンドアロンなMicroPython単独でSQL系DB使うのは現実的ではないかと。しかしMicroPythonには固有の実装としてbtreeモジュールあり、標準辞書型に近い形の連想配列を「永続化」可能であります。
※「MicroPython的午睡」投稿順 Indexはこちら
BTreeデータベース
BTreeはキー/バリュー型のデータベースです。この方が下手にリレーショナル・データベースを使うよりPythonのネーチャーにはあっているかと(個人の感想です。)詳細についてはいつもお世話になっているMicroPythonの日本語ドキュメントから以下のページをご参照くだされ。
プログラミング上はPython標準の辞書型(連想配列)とクリソツなのですが、以下の相違があります。
-
- 使う前にオープン、使い終わったらクローズが必要
- キー、バリューとも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を走らせたところが以下に。
device側のMicroPythonストレージに test.db なるファイルが生成されおり、また、2件のデータが読み出せていることが分かります。良かった。
今回は、単純なデータの扱いだったけれども、もっと複雑な構造のデータの永続化もやった方が良いな。また次回か。