Package: aiostorage-orm
AioStorageORM (CyberPhysics)Установкаpipinstallaiostorage-ormЗависимостиredis-pynest-asyncioБазовый пример использования (все примеры,базовый пример)Импорт классовimportredis.asyncioasredisfromaiostorage_ormimportAIOStorageORMfromaiostorage_ormimportAIORedisORMfromaiostorage_ormimportAIORedisItemfromaiostorage_ormimportOperationResultОпределить модельclassExampleItem(AIORedisItem):"""Атрибуты объекта с указанием типа данных(в процессе сбора данных из БД приводится тип)"""date_time:intany_value:floatclassMeta:"""Системный префикс записи в RedisКлючи указанные в префиксе обязательны дляпередачи в момент создания экземпляра"""table="subsystem.{subsystem_id}.tag.{tag_id}"Установить подключение ORM можно двумя способамиПередать данные для подключения непосредственно в ORMorm:AIOStorageORM=AIORedisORM(host="localhost",port=8379,db=1)awaitorm.init()Создать подключение redis.Redis и передать его в конструкторredis:redis.Redis=redis.Redis(host="localhost",port=8379,db=1)orm:AIOStorageORM=AIORedisORM(client=redis)awaitorm.init()Добавление/редактирование записи (ключами записи являются параметры, указанные в Meta.table модели)Создать объект на основе моделиexample_item:ExampleItem=ExampleItem(subsystem_id=3,tag_id=15,date_time=100,any_value=17.)Выполнить вставку можно несколькими способамиИспользовать метод save() созданного экземпляраoperation_result:OperationResult=awaitexample_item.save()Использовать метод save() AIOStorageOrmoperation_result:OperationResult=awaitorm.save(item=example_item)Использоватьгрупповуювставку записей (пример групповой вставки)operation_result:OperationResult=awaitorm.bulk_create(items=[example_item1,example_item2])Выборка данных из БДдля выборки необходимо передать аргументы для параметров, которые используются в Meta.tabletable="subsystem.{subsystem_id}.tag.{tag_id}"^^, напримерexample_items:ExampleItem=awaitexampleitem.get(subsystem_id=3,tag_id=15)Использование нескольких подключений (пример)для использования нескольких подключений необходимо в метод AIOStorageItem.using(db_instance=...) передать
подготовленное соединение с БД Redis, напримерredis_another:redis.Redis=redis.Redis(host="localhost",port=8379,db=17)...result_of_operation:OperationResult=awaitexample_item.using(db_instance=redis_another).save()Поиск по списку значений (пример)для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значенийgetted_items:list[ExampleItem]=awaitExampleItem.filter(subsystem_id__in=[21,23],tag_id=15)Поиск по предварительно подготовленному объекту (пример)для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать
его в метод AIORedisORM.getitem:ExampleItem=ExampleItem(subsystem_id=1,tag_id=15)item_by_object:ExampleItem|None=awaitExampleItem.get(_item=item)Поиск по предварительно подготовленным объектам (пример)для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать
их списком в метод AIORedisORM.filteritems:list[ExampleItem]=[ExampleItem(subsystem_id=1,tag_id=15),ExampleItem(subsystem_id=2,tag_id=16),]item_by_objects:list[ExampleItem]=awaitExampleItem.filter(_items=items)Удаление одного объекта (пример)example_item:ExampleItem=ExampleItem(subsystem_id=3,tag_id=15)result_of_operation:OperationResult=awaitexample_item.delete()Удаление нескольких объектов одновременно (пример)result_of_operation:OperationResult=awaitorm.bulk_delete(items=example_items)Добавление объектов с ограниченным временем жизни (пример)classExampleItem(AIORedisItem):# Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)date_time:intany_value:strclassMeta:# Системный префикс записи в Redis# Ключи указанные в префиксе обязательны для передачи в момент создания экземпляраtable="subsystem.{subsystem_id}.tag.{tag_id}"# Время жизни объекта в базе данныхttl=10...example_item:ExampleItem=ExampleItem(subsystem_id=3,tag_id=15,date_time=100,any_value=17.)result_of_operation:OperationResult=awaitexample_item.save()...example_items:list[ExampleItem]=[]foriinrange(100):subsystem_id:int=i%10example_item:ExampleItem=ExampleItem(subsystem_id=subsystem_id,another_key_value=i,tag_id=10+(15*random.randint(0,1)),date_time=i*100,any_value=random.random()*10,)example_items.append(example_item)result_of_operation:OperationResult=awaitorm.bulk_create(items=example_items)Добавление одной записи во фрейм (пример)classExampleItem(AIORedisItem):# Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)date_time:intany_value:strclassMeta:# Системный префикс записи в Redis# Ключи указанные в префиксе обязательны для передачи в момент создания экземпляраtable="subsystem.{subsystem_id}.tag.{tag_id}"ttl=10# Время жизни объекта в базе данныхframe_size=3# Размер frame'а...result_of_operation:OperationResult=awaitorm.frame.add(item_or_items=example_item)Групповое добавление записей во фрейм (пример)записи могут быть разнородными (должны являться наследником AIORedisItem, но при этом они могут быть определены
различными друг от друга классами)...result_of_operation:OperationResult=awaitorm.frame.add(item_or_items=[example_item,example_item_2])Сбор данных из фрейма (пример)данные из фрейма можно получить только списком (list[ExampleItem])получение данных из фрейма ограничивается агрументами start_index и end_index (включительно, т.е. самый старый элемент
get(ExampleItem(), 0, 0), самый последний добавленный get(ExampleItem(), -1, -1))...result_of_operation:OperationResult=awaitorm.frame.get(item=example_item)Запуск примеровpython-mvenvvenvsource./venv/bin/activatepipinstallredis# Базовый простой примерPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_1_single.py# Пример групповой вставки (bulk)PYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_2_bulk_multiple.py# Пример использования нескольких подключенийPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_3_using_multiple_connections.py# Пример поиска по списку значенийPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_4_values_in_list.py# Пример поиска по переданному подготовленному экземпляруPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_5_find_by_object.py# Пример удаления объектовPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_6_delete_item.py# Пример добавления объектов с ограниченным временем жизниPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_7_ttl.py# Пример работы с frame'амиPYTHONPATH="${PYTHONPATH}:."pythonexamples/redis_8_frame.py