Package: acapelladb
ОписаниеАсинхронный Python-клиент для Key-Value базы данныхAcapellaDB.Примеры использованияДля начала работы необходимо создать сессию:>>>session=Session(host='localhost',port=12000)Базовые GET/SET операции с ключами производятся с помощью класса Entry:>>># создание объекта Entry, ключи являются массивом строк>>>entry=session.entry(["foo","bar"])>>># установка значения>>>awaitentry.set("value 1")>>># установка значения с условием совпадения версии>>>awaitentry.cas("value 2")>>># получение значения по ключу и сохранение в Entry>>>entry=awaitsession.get_entry(["foo","bar"])>>>print(f'value = "{entry.value}", version ={entry.version}')value="value 2",version=2Для хранения сложных структур данных введены две части ключа:partitionиclustering. Первый используется для распределения данных по кластеру. Все clustering-ключи в пределах одного partition-ключа лежат вместе на каждой реплике, что обеспечивает возможность выборок и batch-запросов.Пример работы со списком пользователей внутри одного partition'а:>>># создание списка>>>awaitsession.entry(partition=["users"],clustering=["first"]).set({>>>'age':25>>>})>>>awaitsession.entry(partition=["users"],clustering=["second"]).set({>>>'age':32>>>})>>>awaitsession.entry(partition=["users"],clustering=["third"]).set({>>>'age':21>>>})>>># выборка всех пользователей>>>data=awaitsession.range(partition=["users"])>>>foreindata:>>>print(f'{e.key[0]}:{e.value.age}')first:25second:32third:21>>># выборка первых 2-х пользователей>>>data=awaitsession.range(partition=["users"],limit=2)>>>foreindata:>>>print(f'{e.key[0]}:{e.value.age}')first:25second:32Пример работы с очередью:>>># запись событий в очередь по 10 штук>>>foriinrange(10):>>># записи производятся в батч, а потом выполняется один запрос>>>batch=BatchManual()>>>foriinrange(10):>>>key=str(uuid1())>>>e=session.entry(partition=["queue-1"],clustering=[key])>>>awaite.set(value=i,batch=batch)>>># выполнение батча>>>awaitbatch.send()>>># чтение событий из очереди по 10 штук>>>first=[]>>>foriinrannge(10):>>>data=awaitsession.range(partition=["queue-1"],first=first,limit=10)>>>foreindata:>>>print(f'{e.key}:{e.value}')>>>first=data[len(data)-1].key>>>['be2a5d92-8cc0-11e7-8bb2-40e230b5623b']:0['be2a6058-8cc0-11e7-8bb2-40e230b5623b']:1['be2a61f2-8cc0-11e7-8bb2-40e230b5623b']:2...['be2ae000-8cc0-11e7-8bb2-40e230b5623b']:99>>># выборка всех событий за определённый интервал времени>>>data=awaitsession.range(>>>partition=["queue-1"],>>>first=['be2a61f2-8cc0-11e7-8bb2-40e230b5623b'],>>>last=['be2a7fac-8cc0-11e7-8bb2-40e230b5623b']>>>)Для работы с деревьями (DT, Distributed Tree) используются классы Tree и Cursor:>>># создание дерева>>>tree=session.tree(["test","tree"])>>># заполнение дерева>>>awaittree.cursor(["a"]).set("1")>>>awaittree.cursor(["b"]).set("2")>>>awaittree.cursor(["c"]).set("3")>>>awaittree.cursor(["d"]).set("4")>>>awaittree.cursor(["e"]).set("5")>>># получение следующего ключа в дереве>>>next=awaittree.cursor(["b"]).next()# next.key = ["c"]>>># получение предыдущего ключа в дереве>>>prev=awaittree.cursor(["b"]).next()# next.key = ["a"]>>># выборка данных по заданным ограничениям>>>data=awaittree.range(first=["a"],last=["d"],limit=2)>>>print([e.keyforeindata])[['b'],['c']]Так же для всех операций доступен транзакционный режим. Транзакции можно использовать в двух режимах:как context manager>>>asyncwithsession.transaction()astx:>>># использование транзакции>>>entry=awaittx.get_entry(["foo","bar"])>>>awaitentry.cas("value 3")в "ручном" режиме, необходимо явно вызвать commit/rollback при завершении работы с транзакцией>>># создание транзакции>>>tx=awaitsession.transaction_manual()>>>try:>>># использование транзакции>>>entry=awaittx.get_entry(["foo","bar"])>>>awaitentry.cas("value 3")>>># commit, если не произошло исключений>>>awaittx.commit()>>>exceptException:>>># rollback, если произошла какая-либо ошибка>>>awaittx.rollback()Больше примеров использования можно найти втестах.