sqlitemapInterfaz de diccionario a una base de datos SQLite.
... Un día necesitaba una tienda integrada de valor clave para un proyecto de mascotas, pero no encontré una implementación "lo suficientemente buena". Entonces, hice el mío.
Es un envoltorio liviano sobre el módulo SQLite3 estándar. Proporciona la interfaz estándar MutableMapping para una conexión SQLite y una tabla SQLite.
Connection Creas una instancia de Connection como si fuera una llamada normal sqlite3.connect :
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Implementa la interfaz del Administrador de contexto, por lo que se with para hacer una transacción como si fuera una sqlite3.Connection . E implementa MutableMapping[str, Collection] , excepto __setitem__ . Por lo tanto, puede imaginar una Connection como un diccionario de colecciones por completo con sus nombres y hacer prácticamente todo lo que pueda hacer con 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 () Internamente, la colección es una tabla con dos columnas: key: str y value: bytes . Por lo tanto, necesita algo de serialización para representar objetos como cadenas de bytes. Por defecto, sqlitemap utiliza el módulo json estándar. Recoge ujson o orjson , si está disponible. Estos también están disponibles como sqlitemap extras: sqlitemap[ujson] y sqlitemap[orjson] .
De lo contrario, puede especificar cualquier Callable[[Any], bytes] para codificador y Callable[[bytes], Any] para decodificador:
connection = Connection ( ':memory:' , dumps_ = custom_dumps , loads_ = custom_loads )Collection Collection también implementa la interfaz del administrador de contexto para hacer una transacción y MutableMapping[str, Any] :
with raises ( KeyError ):
_ = collection [ 'foo' ]
collection [ 'foo' ] = 'bar'
assert collection [ 'foo' ] == 'bar'
collection [ 'foo' ] = 'qux'
assert collection [ 'foo' ] == 'qux' La columna key es una clave principal.
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__ y Collection.__setitem__ también admiten las cortes como sus argumentos. start de Slice se convierte a key >= start , stop a key < stop y step a key LIKE step . Todos estos se combinan con el AND el operador. Collection.__getitem__ también aplica ORDER BY key , por lo que es posible hacer algunas consultas más 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 ] Lo mismo también funciona con del collection [...] . Elimina las filas que se seleccionarían con la llamada __getitem__ correspondiente:
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 no hace nada especial para controlar las transacciones. Para eso, consulte la documentación de la biblioteca estándar.