
フル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件のデータが読み出せていることが分かります。良かった。
今回は、単純なデータの扱いだったけれども、もっと複雑な構造のデータの永続化もやった方が良いな。また次回か。