sqlitemapsqliteデータベースへの辞書インターフェイス。
…ある日、ペットプロジェクトに埋め込まれたキー価値ストアが必要でしたが、「十分な」実装は見つかりませんでした。だから、私は自分で作った。
標準のSQLite3モジュールの軽量ラッパーです。 SQLite接続とSQLiteテーブルの標準のMutableMappingインターフェイスを提供します。
Connection通常のsqlite3.connect呼び出しであるかのように、 Connectionのインスタンスを作成します。
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Context Managerインターフェイスを実装するため、 sqlite3.Connectionであるかのようwithトランザクションを作成します。また、 __setitem__を除きMutableMapping[str, Collection]を実装します。したがって、コレクションの辞書としてのConnection完全にそれらの名前で想像することができ、通常のdictでできることは事実上すべてを行うことができます。
from sqlitemap import Collection
# Collection is automatically created:
foo : Collection = connection [ 'foo' ]
# You can iterate over collection names:
names = list ( connection )
# Or even over collections:
collections = connection . values ()
# Drop collection:
del connection [ 'foo' ]
# Get number of collections:
len ( connection )
# Special one, to close the connection:
connection . close ()内部的には、コレクションは2つの列を備えたテーブルです。 key: strとvalue: bytes 。したがって、オブジェクトをバイト文字列として表すためにいくつかのシリアル化が必要です。デフォルトでは、 sqlitemap標準のjsonモジュールを使用します。利用可能な場合は、 ujsonまたはorjsonを拾います。これらは、 sqlitemap extras: sqlitemap[ujson]およびsqlitemap[orjson]としても使用できます。
それ以外の場合は、エンコーダー用のカスタムCallable[[Any], bytes]を指定し、デコーダーにCallable[[bytes], Any]指定できます。
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collectionまた、 Collection 、コンテキストマネージャーインターフェイスを実装してトランザクションを作成し、 MutableMapping[str, Any]実装します。
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' key列が主キーです。
assert list ( collection ) == []
collection [ 'foo' ] = 'bar'
assert list ( collection ) == [ 'foo' ] assert collection . values () == []
collection [ 'foo' ] = 'bar'
assert collection . values () == [ 'bar' ] with raises ( KeyError ):
del collection [ 'foo' ]
collection [ 'foo' ] = 42
del collection [ 'foo' ]
with raises ( KeyError ):
del collection [ 'foo' ]Collection.__getitem__とCollection.__setitem__ 、引数としてスライスもサポートしています。スライスstartはkey >= start句に変換され、 key < stopにstop 、 key LIKE stepにステップをstep 。これらはすべて、 ANDオペレーターと組み合わされています。 Collection.__getitem__ ORDER BY keyを適用するため、より洗練されたクエリを作成することができます。
collection [ 'bar' ] = 1
collection [ 'foo' ] = 2
collection [ 'quw' ] = 3
collection [ 'qux' ] = 4
collection [ 'quy' ] = 5
collection [ 'quz' ] = 6
assert collection [ 'foo' :] == [ 2 , 3 , 4 , 5 , 6 ]
assert collection [: 'foo' ] == [ 1 ]
assert collection [:: 'qu%' ] == [ 3 , 4 , 5 , 6 ]
assert collection [ 'bar' : 'quz' : 'qu%' ] == [ 3 , 4 , 5 ]同じことがdel collection [...]でも機能します。対応する__getitem__コールで選択される行を削除します。
collection [ 'bar' ] = 1
collection [ 'foo' ] = 2
collection [ 'quw' ] = 3
collection [ 'qux' ] = 4
collection [ 'quy' ] = 5
collection [ 'quz' ] = 6
del collection [ 'bar' : 'quz' : 'qu%' ]
assert list ( collection ) == [ 'bar' , 'foo' , 'quz' ]sqlitemap 、トランザクションを制御する特別なことはありません。そのためには、標準のライブラリのドキュメントを参照してください。