sqlitemapInterface de dictionnaire à une base de données SQLite.
… Un jour, j'avais besoin d'un magasin de valeurs clés intégré pour un projet pour animaux de compagnie, mais je n'ai pas trouvé de mise en œuvre «assez bonne». Alors, j'en ai fait un.
C'est un wrapper léger sur le module SQLite3 standard. Il fournit l'interface standard MutableMapping pour une connexion SQLite et une table SQLite.
Connection Vous créez une instance de Connection comme s'il s'agissait d'un appel sqlite3.connect normal:
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Il met en œuvre l'interface du gestionnaire de contexte, vous utilisez donc with pour effectuer une transaction comme s'il s'agissait d'un sqlite3.Connection . Et il implémente MutableMapping[str, Collection] , à l'exception de __setitem__ . Ainsi, vous pouvez imaginer une Connection en tant que dictionnaire des collections complètement avec leurs noms et faire pratiquement tout ce que vous pourriez faire avec un 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 () En interne, la collection est une table avec deux colonnes: key: str et value: bytes . Ainsi, vous avez besoin d'une sérialisation pour représenter les objets sous forme de chaînes d'octets. Par défaut, sqlitemap utilise le module json standard. Il ramasse ujson ou orjson , s'il est disponible. Ceux-ci sont également disponibles sous forme d'extras sqlitemap : sqlitemap[ujson] et sqlitemap[orjson] .
Sinon, vous pouvez spécifier n'importe quelle personnalité Callable[[Any], bytes] pour l'encodeur et Callable[[bytes], Any] pour décodeur:
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collection Collection implémente également l'interface du gestionnaire de contexte pour effectuer une transaction, et MutableMapping[str, Any] :
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' La colonne key est une clé principale.
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__ et Collection.__setitem__ prennent également en charge les tranches comme arguments. Slice start est ensuite converti en key >= start clause, stop to key < stop and step to key LIKE step . Tous ces éléments sont combinés avec l'opérateur AND . Collection.__getitem__ applique également ORDER BY key , il est donc possible de faire des requêtes plus sophistiquées:
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 ] La même chose fonctionne également avec del collection [...] . Il supprime les lignes qui seraient sélectionnées avec l'appel __getitem__ correspondant:
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 ne fait rien de spécial pour contrôler les transactions. Pour cela, référez-vous à la documentation de la bibliothèque standard.