sqlitemapСловарь интерфейс в базу данных SQLite.
… Однажды мне понадобился встроенный магазин ключей для Pet Project, но я не нашел «достаточно хорошую» реализацию. Итак, я сделал свой собственный.
Это легкая обертка над стандартным модулем SQLite3. Он обеспечивает стандартный интерфейс MutableMapping для подключения SQLite и таблицы SQLite.
Connection Вы создаете экземпляр Connection , как если бы это был обычный вызов sqlite3.connect :
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Он реализует интерфейс диспетчера контекста, поэтому вы with чтобы сделать транзакцию, как если бы это была sqlite3.Connection . И он реализует MutableMapping[str, Collection] , за исключением __setitem__ . Таким образом, вы можете представить собой 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 () Внутренне коллекция - это таблица с двумя столбцами: key: str и value: bytes . Таким образом, вам нужна сериализация, чтобы представлять объекты как строки байтов. По умолчанию sqlitemap использует стандартный модуль json . Он поднимает ujson или orjson , если доступно. Они также доступны в качестве дополнительных дополнительных sqlitemap : 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 , stop к key < stop и step к key LIKE 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 не делает ничего особенного для управления транзакциями. Для этого см. В стандартной документации библиотеки.