sqlitemapواجهة القاموس لقاعدة بيانات SQLite.
... في يوم من الأيام كنت بحاجة إلى متجر قيمة رئيسي مضمن لمشروع الحيوانات الأليفة ، لكنني لم أجد تطبيقًا "جيدًا بما يكفي". لذلك ، لقد صنعت واحدة بلدي.
إنه غلاف خفيف الوزن على وحدة SQLite3 القياسية. يوفر واجهة MutableMapping القياسية لاتصال SQLite وجدول SQLite.
Connection يمكنك إنشاء مثيل Connection كما لو كان sqlite3.connect CALL:
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__ and Collection.__setitem__ أيضًا لشرائح كحجيلاتها. ثم يتم تحويل Slice start إلى key >= start جملة ، stop إلى key < stop و step to 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 لا يفعل أي شيء خاص للتحكم في المعاملات. لذلك ارجع إلى وثائق المكتبة القياسية.