sqlitemapInterface do dicionário para um banco de dados SQLite.
… Um dia eu precisava de uma loja de valores de chave incorporada para um projeto para animais de estimação, mas não encontrei uma implementação "boa o suficiente". Então, eu fiz o meu próprio.
É um invólucro leve sobre o módulo SQLITE3 padrão. Ele fornece a interface padrão MutableMapping para uma conexão SQLite e a tabela SQLite.
Connection Você cria uma instância de Connection como se fosse uma chamada normal sqlite3.connect :
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Ele implementa a interface do Context Manager, para que você with para fazer uma transação como se fosse um sqlite3.Connection . E implementa MutableMapping[str, Collection] , exceto __setitem__ . Assim, você pode imaginar uma Connection como um dicionário de coleções com seus nomes e fazer praticamente tudo o que você poderia fazer com um 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 () Internamente, a coleção é uma tabela com duas colunas: key: str e value: bytes . Portanto, você precisa de alguma serialização para representar objetos como strings de bytes. Por padrão, sqlitemap usa o módulo json padrão. Ele pega ujson ou orjson , se disponível. Estes também estão disponíveis como extras sqlitemap : sqlitemap[ujson] e sqlitemap[orjson] .
Caso contrário, você pode especificar qualquer Callable[[Any], bytes] para codificador e Callable[[bytes], Any] para decodificador:
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collection Collection também implementa a interface do Gerenciador de Contexto para fazer uma transação e MutableMapping[str, Any] :
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' A coluna key é uma chave primária.
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__ e Collection.__setitem__ também suportam fatias como seus argumentos. start da fatia é então convertido para key >= start , stop para key < stop e step para key LIKE step . Tudo isso é combinado com o AND . Collection.__getitem__ também aplica a cláusula ORDER BY key , por isso é possível fazer algumas consultas mais sofisticadas:
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 ] O mesmo também funciona com del collection [...] . Ele exclui as linhas que seriam selecionadas com a chamada __getitem__ correspondente:
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 não faz nada de especial para controlar transações. Para isso, consulte a documentação da biblioteca padrão.