Package: json-stock
json_stock下の方に日本語の説明がありますOverviewJSON-based databaseVery simple to operate, but fast, and supports parallel processing.DB itself behaves like "one big JSON"description is under construction.Usageimportjson_stockasjst# open DBtest_db=jst.JsonStock("./test_db/")print(test_db)# create tabletest_db["test_table"]={}# get tabletest_table=test_db["test_table"]print(test_table)# create new valuetest_table["test"]={"hello":"world!!"}# read valueprint(test_table["test"])# show tableprint(test_table)# iterate (listup all keys in the table)print([keyforkeyintest_table])# delete valuedeltest_table["test"]# delete tabledeltest_db["test_table"]Advanced: transactionIf the following is written, the "test" key is locked in the "WITH" syntax, and other processes cannot change the value of the key until the program emerges from the "WITH" syntax.However, this lock occurs on a per-key basis, not per-table basis, so other keys can be edited without any problem while the program is executing the "WITH" syntax.# lock the "test" keywithtest_table.lock("test")asrec:rec.value["new_key"]="hell"rec.value["hello"]+="!!"If you rewrite rec.value in "WITH" as you like, the rec.value value at the moment of leaving "with" is automatically reflected in the DB ("commit" in general DB).Example of locking multiple keys# lock the "test" keywithtest_table.lock("test")asrec,test_table.lock("test2")asrec2:rec.value["hello"]+="!!"rec2.value["new_key"]=rec.value["hello"]+"hell"# This prevents unintentional rewriting of rec just before changing rec2, and can be used for complex transactions such as money transfer processingExample without "WITH" syntax - Example 1rec=test_table.lock("test")rec.value="hoge"rec.unlock()Example without "WITH" syntax - Example 2rec=test_table.lock("test")rec.value="fuga"test_table.unlock("test")NG Example: DO NOT write like thiswithtest_table.lock("test")asrec:test_table["test"]="hoge"# NGIn the above example, the edit of the "test" key is locked in with, so if you try to edit the value via test_table, the lock is not released forever and the program freezes.It is correct to write as followswithtest_table.lock("test")asrec:rec.value="hoge"# OKThe rec object is given special permission to edit the "test" key in the "WITH" syntax, so it can only edit that data through rec.value while it is locked.概要JSONベースのデータベース操作が非常に単純だが、高速で、並列処理にも対応DB自体が「1つの大きなJSON」のように振る舞う使用例importjson_stockasjst# DBを開く (存在しない場合はディレクトリが自動的に作成される)test_db=jst.JsonStock("./test_db/")print(test_db)# テーブルの作成 (右辺は必ず空の辞書である必要がある)test_db["test_table"]={}# テーブルの取得test_table=test_db["test_table"]print(test_table)# テーブルの"test"キーにデータを登録 (すでにキーが存在する場合は上書き)test_table["test"]={"hello":"world!!"}# テーブルの"test"キーに束縛されたデータを読み出すprint(test_table["test"])# テーブルの可視化 (soutを用いれば表示レコード数上限もカスタマイズ可能)print(test_table)# for文脈でテーブルの全キーを巡回print([keyforkeyintest_table])# "test"キーの値を削除deltest_table["test"]# テーブルの削除deltest_db["test_table"]発展的な例: トランザクション処理下記のように書くと、with構文内で"test"キーがロックされ、withから脱出するまでは他のプロセスが当該キーの値を変更できなくなるただしこのロックはtable単位ではなく、キー単位で発生するので、withの間も他のkeyは問題なく編集できる# "test"キーをロックするwithtest_table.lock("test")asrec:rec.value["new_key"]="hell"rec.value["hello"]+="!!"with内でrec.valueを好きなように書き換えると、withを抜けた瞬間のrec.value値が自動的にDBに反映される (一般的なDBでいうところの「コミット」)複数のkeyをロックする例# lock the "test" keywithtest_table.lock("test")asrec,test_table.lock("test2")asrec2:rec.value["hello"]+="!!"rec2.value["new_key"]=rec.value["hello"]+"hell"# このように書けば、rec2を変更する直前に意図せずrecが書き換わってしまう等が防げるため、送金処理などの複雑なトランザクションにも利用できるwith構文を使わない例 - その1rec=test_table.lock("test")rec.value="hoge"rec.unlock()with構文を使わない例 - その2rec=test_table.lock("test")rec.value="fuga"test_table.unlock("test")NG例: 下記のような書き方をしてはいけないwithtest_table.lock("test")asrec:test_table["test"]="hoge"# NG上記の例では、with内において"test"keyの編集がロックされているため、test_table経由で値の編集を試みると、永遠にロックが解除されず、フリーズする下記のように書くのが正しいwithtest_table.lock("test")asrec:rec.value="hoge"# OKrecオブジェクトは、with構文内において、"test"キーを編集する特別な権限を与えられているため、ロック中はrec.valueを通じてのみ当該データを編集することができる