#### AioStorageORM (CyberPhysics)
[![Upload pypi](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/pypi_deploy.yml/badge.svg)](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/pypi_deploy.yml)
[![Linting & Pytest](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/lint_and_test.yml/badge.svg)](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/lint_and_test.yml)
##### Установка
```bash
pip install aiostorage-orm
```
##### Зависимости
- [redis-py](https://github.com/redis/redis-py)
- [nest-asyncio](https://github.com/erdewit/nest_asyncio)
##### Базовый пример использования ([все примеры](examples/), [базовый пример](examples/redis_1_single.py))
1. Импорт классов
```python
import redis.asyncio as redis
from aiostorage_orm import AIOStorageORM
from aiostorage_orm import AIORedisORM
from aiostorage_orm import AIORedisItem
from aiostorage_orm import OperationResult
```
1. Определить модель
```python
class ExampleItem(AIORedisItem):
"""
Атрибуты объекта с указанием типа данных
(в процессе сбора данных из БД приводится тип)
"""
date_time: int
any_value: float
class Meta:
"""
Системный префикс записи в Redis
Ключи указанные в префиксе обязательны для
передачи в момент создания экземпляра
"""
table = "subsystem.{subsystem_id}.tag.{tag_id}"
```
1. Установить подключение ORM можно двумя способами
1. Передать данные для подключения непосредственно в ORM
```python
orm: AIOStorageORM = AIORedisORM(host="localhost", port=8379, db=1)
await orm.init()
```
1. Создать подключение redis.Redis и передать его в конструктор
```python
redis: redis.Redis = redis.Redis(host="localhost", port=8379, db=1)
orm: AIOStorageORM = AIORedisORM(client=redis)
await orm.init()
```
1. Добавление/редактирование записи (ключами записи являются параметры, указанные в Meta.table модели)
1. Создать объект на основе модели
```python
example_item: ExampleItem = ExampleItem(
subsystem_id=3,
tag_id=15,
date_time=100,
any_value=17.
)
```
1. Выполнить вставку можно несколькими способами
1. Использовать метод save() созданного экземпляра
```python
operation_result: OperationResult = await example_item.save()
```
1. Использовать метод save() AIOStorageOrm
```python
operation_result: OperationResult = await orm.save(item=example_item)
```
1. Использовать **групповую** вставку записей ([пример групповой вставки](examples/redis_2_bulk_multiple.py))
```python
operation_result: OperationResult = await orm.bulk_create(
items=[example_item1, example_item2]
)
```
1. Выборка данных из БД
- для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
```python
table = "subsystem.{subsystem_id}.tag.{tag_id}"
^ ^
```
, например
```python
example_items: ExampleItem = await exampleitem.get(subsystem_id=3, tag_id=15)
```
1. Использование нескольких подключений ([пример](examples/redis_3_using_multiple_connections.py))
- для использования нескольких подключений необходимо в метод AIOStorageItem.using(db_instance=...) передать
подготовленное соединение с БД Redis, например
```python
redis_another: redis.Redis = redis.Redis(host="localhost", port=8379, db=17)
...
result_of_operation: OperationResult = await example_item.using(db_instance=redis_another).save()
```
1. Поиск по списку значений ([пример](examples/redis_4_values_in_list.py))
- для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значений
```python
getted_items: list[ExampleItem] = await ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)
```
1. Поиск по предварительно подготовленному объекту ([пример](examples/redis_5_find_by_object.py))
- для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать
его в метод AIORedisORM.get
```python
item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15)
item_by_object: ExampleItem | None = await ExampleItem.get(_item=item)
```
1. Поиск по предварительно подготовленным объектам ([пример](examples/redis_5_find_by_object.py))
- для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать
их списком в метод AIORedisORM.filter
```python
items: list[ExampleItem] = [
ExampleItem(subsystem_id=1, tag_id=15),
ExampleItem(subsystem_id=2, tag_id=16),
]
item_by_objects: list[ExampleItem] = await ExampleItem.filter(_items=items)
```
1. Удаление одного объекта ([пример](examples/redis_6_delete_item.py))
```python
example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15)
result_of_operation: OperationResult = await example_item.delete()
```
1. Удаление нескольких объектов одновременно ([пример](examples/redis_6_delete_item.py))
```python
result_of_operation: OperationResult = await orm.bulk_delete(items=example_items)
```
1. Добавление объектов с ограниченным временем жизни ([пример](examples/redis_7_ttl.py))
```python
class ExampleItem(AIORedisItem):
# Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)
date_time: int
any_value: str
class Meta:
# Системный префикс записи в 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 = await example_item.save()
...
example_items: list[ExampleItem] = []
for i in range(100):
subsystem_id: int = i % 10
example_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 = await orm.bulk_create(items=example_items)
```
1. Добавление одной записи во фрейм ([пример](examples/redis_8_frame.py))
```python
class ExampleItem(AIORedisItem):
# Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)
date_time: int
any_value: str
class Meta:
# Системный префикс записи в Redis
# Ключи указанные в префиксе обязательны для передачи в момент создания экземпляра
table = "subsystem.{subsystem_id}.tag.{tag_id}"
ttl = 10 # Время жизни объекта в базе данных
frame_size = 3 # Размер frame'а
...
result_of_operation: OperationResult = await orm.frame.add(item_or_items=example_item)
```
1. Групповое добавление записей во фрейм ([пример](examples/redis_8_frame.py))
* записи могут быть разнородными (должны являться наследником AIORedisItem, но при этом они могут быть определены
различными друг от друга классами)
```python
...
result_of_operation: OperationResult = await orm.frame.add(item_or_items=[example_item, example_item_2])
```
1. Сбор данных из фрейма ([пример](examples/redis_8_frame.py))
* данные из фрейма можно получить только списком (list[ExampleItem])
* получение данных из фрейма ограничивается агрументами start_index и end_index (включительно, т.е. самый старый элемент
get(ExampleItem(), 0, 0), самый последний добавленный get(ExampleItem(), -1, -1))
```python
...
result_of_operation: OperationResult = await orm.frame.get(item=example_item)
```
##### Запуск примеров
```bash
python -m venv venv
source ./venv/bin/activate
pip install redis
# Базовый простой пример
PYTHONPATH="${PYTHONPATH}:." python examples/redis_1_single.py
# Пример групповой вставки (bulk)
PYTHONPATH="${PYTHONPATH}:." python examples/redis_2_bulk_multiple.py
# Пример использования нескольких подключений
PYTHONPATH="${PYTHONPATH}:." python examples/redis_3_using_multiple_connections.py
# Пример поиска по списку значений
PYTHONPATH="${PYTHONPATH}:." python examples/redis_4_values_in_list.py
# Пример поиска по переданному подготовленному экземпляру
PYTHONPATH="${PYTHONPATH}:." python examples/redis_5_find_by_object.py
# Пример удаления объектов
PYTHONPATH="${PYTHONPATH}:." python examples/redis_6_delete_item.py
# Пример добавления объектов с ограниченным временем жизни
PYTHONPATH="${PYTHONPATH}:." python examples/redis_7_ttl.py
# Пример работы с frame'ами
PYTHONPATH="${PYTHONPATH}:." python examples/redis_8_frame.py
```
Raw data
{
"_id": null,
"home_page": "https://github.com/CyberPhysics-Platform/aiostorage-orm",
"name": "aiostorage-orm",
"maintainer": "",
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": "",
"keywords": "",
"author": "aarekuha",
"author_email": "aarekuha@gmail.ru",
"download_url": "https://files.pythonhosted.org/packages/42/ae/cf47395dbd41007329293012f5448a35b44455321f822b5631d0f0af667f/aiostorage_orm-1.4.5.tar.gz",
"platform": null,
"description": "#### AioStorageORM (CyberPhysics)\n[![Upload pypi](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/pypi_deploy.yml/badge.svg)](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/pypi_deploy.yml)\n[![Linting & Pytest](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/lint_and_test.yml/badge.svg)](https://github.com/CyberPhysics-Platform/aiostorage-orm/actions/workflows/lint_and_test.yml)\n##### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n```bash\n pip install aiostorage-orm\n```\n##### \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n- [redis-py](https://github.com/redis/redis-py)\n- [nest-asyncio](https://github.com/erdewit/nest_asyncio)\n##### \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f ([\u0432\u0441\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b](examples/), [\u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_1_single.py))\n1. \u0418\u043c\u043f\u043e\u0440\u0442 \u043a\u043b\u0430\u0441\u0441\u043e\u0432\n ```python\n import redis.asyncio as redis\n\n from aiostorage_orm import AIOStorageORM\n from aiostorage_orm import AIORedisORM\n from aiostorage_orm import AIORedisItem\n from aiostorage_orm import OperationResult\n ```\n1. \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0434\u0435\u043b\u044c\n ```python\n class ExampleItem(AIORedisItem):\n \"\"\"\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\n (\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0438\u043f)\n \"\"\"\n date_time: int\n any_value: float\n\n class Meta:\n \"\"\"\n \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Redis\n \u041a\u043b\u044e\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0434\u043b\u044f\n \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\n \"\"\"\n table = \"subsystem.{subsystem_id}.tag.{tag_id}\"\n ```\n1. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 ORM \u043c\u043e\u0436\u043d\u043e \u0434\u0432\u0443\u043c\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438\n 1. \u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432 ORM\n ```python\n orm: AIOStorageORM = AIORedisORM(host=\"localhost\", port=8379, db=1)\n await orm.init()\n ```\n 1. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 redis.Redis \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\n ```python\n redis: redis.Redis = redis.Redis(host=\"localhost\", port=8379, db=1)\n orm: AIOStorageORM = AIORedisORM(client=redis)\n await orm.init()\n ```\n1. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 (\u043a\u043b\u044e\u0447\u0430\u043c\u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 Meta.table \u043c\u043e\u0434\u0435\u043b\u0438)\n 1. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043c\u043e\u0434\u0435\u043b\u0438\n ```python\n example_item: ExampleItem = ExampleItem(\n subsystem_id=3,\n tag_id=15,\n date_time=100,\n any_value=17.\n )\n ```\n 1. \u0412\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438\n 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 save() \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\n ```python\n operation_result: OperationResult = await example_item.save()\n ```\n 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 save() AIOStorageOrm\n ```python\n operation_result: OperationResult = await orm.save(item=example_item)\n ```\n 1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c **\u0433\u0440\u0443\u043f\u043f\u043e\u0432\u0443\u044e** \u0432\u0441\u0442\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 ([\u043f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438](examples/redis_2_bulk_multiple.py))\n ```python\n operation_result: OperationResult = await orm.bulk_create(\n items=[example_item1, example_item2]\n )\n ```\n1. \u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\n - \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0432 Meta.table\n ```python\n table = \"subsystem.{subsystem_id}.tag.{tag_id}\"\n ^ ^\n ```\n , \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\n ```python\n example_items: ExampleItem = await exampleitem.get(subsystem_id=3, tag_id=15)\n ```\n1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_3_using_multiple_connections.py))\n - \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432 \u043c\u0435\u0442\u043e\u0434 AIOStorageItem.using(db_instance=...) \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c\n \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0411\u0414 Redis, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440\n ```python\n redis_another: redis.Redis = redis.Redis(host=\"localhost\", port=8379, db=17)\n ...\n result_of_operation: OperationResult = await example_item.using(db_instance=redis_another).save()\n ```\n1. \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_4_values_in_list.py))\n - \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0435\u043c\u0443\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043a\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0443\u0444\u0444\u0438\u043a\u0441\u043e\u043c __in, \u0432\n \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0441\u043a\u043e\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\n ```python\n getted_items: list[ExampleItem] = await ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)\n ```\n1. \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0443 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_5_find_by_object.py))\n - \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c\n \u0435\u0433\u043e \u0432 \u043c\u0435\u0442\u043e\u0434 AIORedisORM.get\n ```python\n item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15)\n item_by_object: ExampleItem | None = await ExampleItem.get(_item=item)\n ```\n1. \u041f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_5_find_by_object.py))\n - \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c\n \u0438\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0432 \u043c\u0435\u0442\u043e\u0434 AIORedisORM.filter\n ```python\n items: list[ExampleItem] = [\n ExampleItem(subsystem_id=1, tag_id=15),\n ExampleItem(subsystem_id=2, tag_id=16),\n ]\n item_by_objects: list[ExampleItem] = await ExampleItem.filter(_items=items)\n ```\n1. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_6_delete_item.py))\n ```python\n example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15)\n result_of_operation: OperationResult = await example_item.delete()\n ```\n1. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_6_delete_item.py))\n ```python\n result_of_operation: OperationResult = await orm.bulk_delete(items=example_items)\n ```\n1. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_7_ttl.py))\n ```python\n class ExampleItem(AIORedisItem):\n # \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0438\u043f)\n date_time: int\n any_value: str\n\n class Meta:\n # \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Redis\n # \u041a\u043b\u044e\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\n table = \"subsystem.{subsystem_id}.tag.{tag_id}\"\n # \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n ttl = 10\n ...\n example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15, date_time=100, any_value=17.)\n result_of_operation: OperationResult = await example_item.save()\n ...\n example_items: list[ExampleItem] = []\n for i in range(100):\n subsystem_id: int = i % 10\n example_item: ExampleItem = ExampleItem(\n subsystem_id=subsystem_id,\n another_key_value=i,\n tag_id=10 + (15 * random.randint(0, 1)),\n date_time=i*100,\n any_value=random.random() * 10,\n )\n example_items.append(example_item)\n result_of_operation: OperationResult = await orm.bulk_create(items=example_items)\n ```\n1. \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e \u0444\u0440\u0435\u0439\u043c ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_8_frame.py))\n ```python\n class ExampleItem(AIORedisItem):\n # \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0441\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414 \u043f\u0440\u0438\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0438\u043f)\n date_time: int\n any_value: str\n\n class Meta:\n # \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 Redis\n # \u041a\u043b\u044e\u0447\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0435\u0444\u0438\u043a\u0441\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430\n table = \"subsystem.{subsystem_id}.tag.{tag_id}\"\n ttl = 10 # \u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0431\u0430\u0437\u0435 \u0434\u0430\u043d\u043d\u044b\u0445\n frame_size = 3 # \u0420\u0430\u0437\u043c\u0435\u0440 frame'\u0430\n ...\n result_of_operation: OperationResult = await orm.frame.add(item_or_items=example_item)\n ```\n1. \u0413\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432\u043e \u0444\u0440\u0435\u0439\u043c ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_8_frame.py))\n * \u0437\u0430\u043f\u0438\u0441\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043d\u043e\u0440\u043e\u0434\u043d\u044b\u043c\u0438 (\u0434\u043e\u043b\u0436\u043d\u044b \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a\u043e\u043c AIORedisItem, \u043d\u043e \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b\n \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438)\n ```python\n ...\n result_of_operation: OperationResult = await orm.frame.add(item_or_items=[example_item, example_item_2])\n ```\n1. \u0421\u0431\u043e\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0430 ([\u043f\u0440\u0438\u043c\u0435\u0440](examples/redis_8_frame.py))\n * \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c (list[ExampleItem])\n * \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u0433\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 start_index \u0438 end_index (\u0432\u043a\u043b\u044e\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0442.\u0435. \u0441\u0430\u043c\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\n get(ExampleItem(), 0, 0), \u0441\u0430\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 get(ExampleItem(), -1, -1))\n ```python\n ...\n result_of_operation: OperationResult = await orm.frame.get(item=example_item)\n ```\n##### \u0417\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432\n```bash\n python -m venv venv\n source ./venv/bin/activate\n pip install redis\n\n # \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_1_single.py\n\n # \u041f\u0440\u0438\u043c\u0435\u0440 \u0433\u0440\u0443\u043f\u043f\u043e\u0432\u043e\u0439 \u0432\u0441\u0442\u0430\u0432\u043a\u0438 (bulk)\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_2_bulk_multiple.py\n\n # \u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_3_using_multiple_connections.py\n\n # \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_4_values_in_list.py\n\n # \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u0430 \u043f\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0443\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_5_find_by_object.py\n\n # \u041f\u0440\u0438\u043c\u0435\u0440 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_6_delete_item.py\n \n # \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0436\u0438\u0437\u043d\u0438\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_7_ttl.py\n \n # \u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 frame'\u0430\u043c\u0438\n PYTHONPATH=\"${PYTHONPATH}:.\" python examples/redis_8_frame.py\n```\n",
"bugtrack_url": null,
"license": "Apache License, Version 2.0",
"summary": "Python for using in-memory storage with ORM",
"version": "1.4.5",
"project_urls": {
"Download": "https://github.com/CyberPhysics-Platform/aiostorage-orm/archive/refs/heads/master.zip",
"Homepage": "https://github.com/CyberPhysics-Platform/aiostorage-orm"
},
"split_keywords": [],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "a36557b089858a76f778156991100328f87db353e88db587ff13537bc9e3e26e",
"md5": "19124de9fbe51c76ad1e7dced9900b2c",
"sha256": "d2fcb44760a0941a13c332c8436713cf500d20526c6b3e132f23f7f6c1cf8370"
},
"downloads": -1,
"filename": "aiostorage_orm-1.4.5-py3-none-any.whl",
"has_sig": false,
"md5_digest": "19124de9fbe51c76ad1e7dced9900b2c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 18111,
"upload_time": "2023-09-18T14:16:31",
"upload_time_iso_8601": "2023-09-18T14:16:31.737605Z",
"url": "https://files.pythonhosted.org/packages/a3/65/57b089858a76f778156991100328f87db353e88db587ff13537bc9e3e26e/aiostorage_orm-1.4.5-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "42aecf47395dbd41007329293012f5448a35b44455321f822b5631d0f0af667f",
"md5": "854f25f09e78ea98b988dd995fca5dda",
"sha256": "088bb4c54f7111698f987cf1cae2332879e6f4ec5ccb4e94531330d4e47ef1a6"
},
"downloads": -1,
"filename": "aiostorage_orm-1.4.5.tar.gz",
"has_sig": false,
"md5_digest": "854f25f09e78ea98b988dd995fca5dda",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 16760,
"upload_time": "2023-09-18T14:16:33",
"upload_time_iso_8601": "2023-09-18T14:16:33.511941Z",
"url": "https://files.pythonhosted.org/packages/42/ae/cf47395dbd41007329293012f5448a35b44455321f822b5631d0f0af667f/aiostorage_orm-1.4.5.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-09-18 14:16:33",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "CyberPhysics-Platform",
"github_project": "aiostorage-orm",
"github_not_found": true,
"lcname": "aiostorage-orm"
}