sqlitemapAntarmuka Kamus ke Database SQLite.
... Suatu hari saya membutuhkan toko nilai kunci tertanam untuk proyek hewan peliharaan, tetapi tidak menemukan implementasi «cukup baik». Jadi, saya membuatnya sendiri.
Ini adalah pembungkus ringan di atas modul SQLite3 standar. Ini menyediakan antarmuka MutableMapping standar untuk koneksi SQLite dan tabel SQLite.
Connection Anda membuat instance Connection seolah -olah itu adalah panggilan sqlite3.connect normal:
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Ini mengimplementasikan antarmuka Context Manager, jadi Anda with untuk melakukan transaksi seolah -olah itu adalah sqlite3.Connection . Dan itu mengimplementasikan MutableMapping[str, Collection] , kecuali untuk __setitem__ . Jadi Anda dapat membayangkan Connection sebagai kamus koleksi sama sekali dengan nama mereka dan melakukan hampir semua yang dapat Anda lakukan dengan dict normal:
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 () Secara internal, koleksi adalah tabel dengan dua kolom: key: str dan value: bytes . Jadi, Anda memerlukan beberapa serialisasi untuk mewakili objek sebagai string byte. Secara default, sqlitemap menggunakan modul json standar. Ini mengambil ujson atau orjson , jika tersedia. Ini juga tersedia sebagai ekstra sqlitemap : sqlitemap[ujson] dan sqlitemap[orjson] .
Kalau tidak, Anda dapat menentukan apa pun Callable[[Any], bytes] untuk encoder dan Callable[[bytes], Any] untuk decoder:
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collection Collection juga mengimplementasikan antarmuka Context Manager untuk melakukan transaksi, dan MutableMapping[str, Any] :
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' Kolom key adalah kunci utama.
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__ dan Collection.__setitem__ juga mendukung irisan sebagai argumen mereka. Slice start kemudian dikonversi ke key >= start Klausa, stop ke key < stop dan step to key LIKE step . Semua ini dikombinasikan dengan AND operator. Collection.__getitem__ juga berlaku ORDER BY key , jadi dimungkinkan untuk membuat beberapa pertanyaan yang lebih canggih:
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 ] Hal yang sama juga berfungsi dengan del collection [...] . Itu menghapus baris yang akan dipilih dengan panggilan __getitem__ yang sesuai:
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 tidak ada yang istimewa untuk mengendalikan transaksi. Untuk itu merujuk ke dokumentasi perpustakaan standar.