sqlitemapSQLITE 데이터베이스에 대한 사전 인터페이스.
… 언젠가는 애완 동물 프로젝트를 위해 내장 된 키 가치 저장소가 필요했지만«충분히 좋은»구현을 찾지 못했습니다. 그래서 나는 내 자신을 만들었습니다.
표준 SQLITE3 모듈의 가벼운 래퍼입니다. SQLITE 연결 및 SQLITE 테이블에 대한 표준 MutableMapping 인터페이스를 제공합니다.
Connection 정상적인 sqlite3.connect 호출 인 것처럼 Connection 인스턴스를 만듭니다.
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) Context Manager 인터페이스를 구현하므로 sqlite3.Connection 인 것처럼 트랜잭션을 수행하는 with 사용합니다. 그리고 __setitem__ 제외하고는 MutableMapping[str, Collection] 구현합니다. 따라서 당신은 그들의 이름을 가진 컬렉션 사전으로 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 and 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 또한 Context Manager 인터페이스를 구현하여 트랜잭션을 만들고 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__ 또한 그들의 논증으로 슬라이스를 지원합니다. 그런 다음 Slice start 가 key >= start 절로 변환하고 key < stop and step to key LIKE step stop 됩니다. 이들 모두는 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 거래를 제어하는 데 특별한 것이 없습니다. 이를 위해 표준 라이브러리 문서를 참조하십시오.