sqlitemapอินเทอร์เฟซพจนานุกรมไปยังฐานข้อมูล SQLite
…วันหนึ่งฉันต้องการร้านค้าคีย์-ค่าฝังตัวสำหรับโครงการสัตว์เลี้ยง แต่ไม่พบการใช้งาน«ดีพอ» ดังนั้นฉันทำเอง
มันเป็นเสื้อคลุมที่มีน้ำหนักเบาเหนือโมดูล SQLITE3 มาตรฐาน มันมีอินเทอร์เฟซ MutableMapping มาตรฐานสำหรับการเชื่อมต่อ SQLite และตาราง SQLite
Connection คุณสร้างอินสแตนซ์ของ Connection ราวกับว่ามันเป็น sqlite3.connect CALL:
from sqlitemap import Connection
connection = Connection ( ':memory:' , ...) มันใช้อินเทอร์เฟซ Context Manager ดังนั้นคุณจึง 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] สำหรับ encoder และ 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__ ยังสนับสนุนชิ้นส่วนเป็นอาร์กิวเมนต์ของพวกเขา 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 ไม่ทำอะไรพิเศษในการควบคุมการทำธุรกรรม สำหรับสิ่งนั้นอ้างถึงเอกสารประกอบไลบรารีมาตรฐาน