sqlitemapDictionary -Schnittstelle zu einer SQLite -Datenbank.
… Eines Tages brauchte ich ein eingebettetes Schlüsselwert für ein Haustierprojekt, fand aber keine «gut genug» Implementierung. Also habe ich meine eigene gemacht.
Es ist eine leichte Wrapper über das Standard -SQLite3 -Modul. Es bietet die Standard MutableMapping -Schnittstelle für eine SQLite -Verbindung und eine SQLite -Tabelle.
Connection Sie erstellen eine Instanz der Connection , als wäre es ein normaler Aufruf von sqlite3.connect :
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Es implementiert die Kontext -Manager -Schnittstelle, sodass Sie eine Transaktion with , als ob es sich um eine sqlite3.Connection handelte. Und es implementiert MutableMapping[str, Collection] , mit Ausnahme von __setitem__ . Sie können sich also eine Connection als Wörterbuch von Sammlungen mit ihren Namen vorstellen und praktisch alles tun, was Sie mit einem normalen dict tun könnten:
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 () Innen ist die Sammlung eine Tabelle mit zwei Spalten: key: str und value: bytes . Sie benötigen also eine Serialisierung, um Objekte als Byte -Saiten darzustellen. Standardmäßig verwendet sqlitemap das Standard json -Modul. Es nimmt ujson oder orjson auf, falls verfügbar. Diese sind auch sqlitemap[orjson] sqlitemap -Extras sqlitemap[ujson] :
Andernfalls können Sie alle benutzerdefinierten Callable[[Any], bytes] für Encoder und Callable[[bytes], Any] für Decodierer angeben:
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collection Collection implementiert auch die Schnittstelle von Context Manager, um eine Transaktion und MutableMapping[str, Any] durchzuführen:
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' key ist ein Primärschlüssel.
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__ und Collection.__setitem__ unterstützt auch Scheiben als Argumente. Slice start wird dann in key >= start konvertiert, stop key < stop , step zu key LIKE step . Alle diese sind mit dem AND Bediener kombiniert. Collection.__getitem__ gilt auch ORDER BY key , daher ist es möglich, einige anspruchsvollere Fragen zu machen:
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 ] Das Gleiche funktioniert auch mit del collection [...] . Es löscht die Zeilen, die mit dem entsprechenden __getitem__ -Anruf ausgewählt würden:
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 ist nichts Besonderes, um Transaktionen zu kontrollieren. Weitere Informationen finden Sie in der Standard -Bibliotheksdokumentation.