storage-orm


Namestorage-orm JSON
Version 1.4.5 PyPI version JSON
download
home_pagehttps://github.com/CyberPhysics-Platform/storage-orm
SummaryPython for using in-memory storage with ORM
upload_time2023-09-18 14:17:06
maintainer
docs_urlNone
authoraarekuha
requires_python>=3.9
licenseApache License, Version 2.0
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            #### StorageORM (CyberPhysics)
[![Upload pypi](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/pypi_deploy.yml/badge.svg)](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/pypi_deploy.yml)
[![Linting & Pytest](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/lint_and_test.yml/badge.svg)](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/lint_and_test.yml)
##### Установка
```bash
    pip install storage-orm
```
##### Зависимости
- [redis-py](https://github.com/redis/redis-py)
##### Базовый пример использования ([все примеры](examples/), [базовый пример](examples/redis_1_single.py))
1. Импорт классов
    ```python
        from storage_orm import StorageORM
        from storage_orm import RedisORM
        from storage_orm import RedisItem
        from storage_orm import OperationResult
    ```
1. Определить модель
    ```python
        class ExampleItem(RedisItem):
            """
                Атрибуты объекта с указанием типа данных
                  (в процессе сбора данных из БД приводится тип)
            """
            date_time: int
            any_value: float

            class Meta:
                """
                    Системный префикс записи в Redis
                    Ключи указанные в префиксе обязательны для
                      передачи в момент создания экземпляра
                """
                table = "subsystem.{subsystem_id}.tag.{tag_id}"
    ```
1. Установить подключение ORM можно двумя способами
    1. Передать данные для подключения непосредственно в ORM
        ```python
            orm: StorageORM = RedisORM(host="localhost", port=6379, db=1)
            orm.init()
        ```
    1. Создать подключение redis.Redis и передать его в конструктор
        ```python
            redis: redis.Redis = redis.Redis(host="localhost", port=6379, db=1)
            orm: StorageORM = RedisORM(client=redis)
            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 = example_item.save()
            ```
        1. Использовать метод save() StorageOrm
            ```python
                operation_result: OperationResult = orm.save(item=example_item)
            ```
        1. Использовать **групповую** вставку записей ([пример групповой вставки](examples/redis_2_bulk_multiple.py))
            ```python
                operation_result: OperationResult = orm.bulk_create(
                    items=[example_item1, example_item2]
                )
            ```
1. Выборка данных из БД
    - для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
        ```python
            table = "subsystem.{subsystem_id}.tag.{tag_id}"
                                     ^               ^
        ```
        , например
        ```python
            example_items: ExampleItem = exampleitem.get(subsystem_id=3, tag_id=15)
        ```
1. Использование нескольких подключений ([пример](examples/redis_3_using_multiple_connections.py))
    - для использования нескольких подключений необходимо в метод StorageItem.using(db_instance=...) передать
      подготовленное соединение с БД Redis, например
        ```python
            redis_another: redis.Redis = redis.Redis(host="localhost", port=6379, db=17)
            ...
            result_of_operation: OperationResult = example_item.using(db_instance=redis_another).save()
        ```
1. Поиск по списку значений ([пример](examples/redis_4_values_in_list.py))
    - для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
      который необходимо передать список искомых значений
        ```python
            getted_items: list[ExampleItem] = ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)
        ```
1. Поиск по предварительно подготовленному объекту ([пример](examples/redis_5_find_by_object.py))
    - для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать
      его в метод RedisORM.get
    ```python
        item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15)
        item_by_object: ExampleItem | None = ExampleItem.get(_item=item)
    ```
1. Поиск по предварительно подготовленным объектам ([пример](examples/redis_5_find_by_object.py))
    - для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать
      их списком в метод RedisORM.filter
    ```python
        items: list[ExampleItem] = [
            ExampleItem(subsystem_id=1, tag_id=15),
            ExampleItem(subsystem_id=2, tag_id=16),
        ]
        item_by_objects: list[ExampleItem] = 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 = example_item.delete()
    ```
1. Удаление нескольких объектов одновременно ([пример](examples/redis_6_delete_item.py))
    ```python
        result_of_operation: OperationResult = orm.bulk_delete(items=example_items)
    ```
1. Добавление объектов с ограниченным временем жизни ([пример](examples/redis_7_ttl.py))
    ```python
        class ExampleItem(RedisItem):
            # Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)
            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 = 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 = orm.bulk_create(items=example_items)
    ```
1. Добавление одной записи во фрейм ([пример](examples/redis_8_frame.py))
    ```python
        class ExampleItem(RedisItem):
            # Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип)
            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 = orm.frame.add(item_or_items=example_item)
    ```
1. Групповое добавление записей во фрейм ([пример](examples/redis_8_frame.py))
    * записи могут быть разнородными (должны являться наследником RedisItem, но при этом они могут быть определены
      различными друг от друга классами)
    ```python
        ...
        result_of_operation: OperationResult = 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 = 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_7_ttl.py

    # Пример работы с frame'ами
    PYTHONPATH="${PYTHONPATH}:." python examples/redis_8_frame.py
```

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/CyberPhysics-Platform/storage-orm",
    "name": "storage-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/23/9c305a88902c80b60070d00759240273b372737e6342c2caefbcc55f2eb4/storage_orm-1.4.5.tar.gz",
    "platform": null,
    "description": "#### StorageORM (CyberPhysics)\n[![Upload pypi](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/pypi_deploy.yml/badge.svg)](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/pypi_deploy.yml)\n[![Linting & Pytest](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/lint_and_test.yml/badge.svg)](https://github.com/CyberPhysics-Platform/storage-orm/actions/workflows/lint_and_test.yml)\n##### \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430\n```bash\n    pip install storage-orm\n```\n##### \u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438\n- [redis-py](https://github.com/redis/redis-py)\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        from storage_orm import StorageORM\n        from storage_orm import RedisORM\n        from storage_orm import RedisItem\n        from storage_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(RedisItem):\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: StorageORM = RedisORM(host=\"localhost\", port=6379, db=1)\n            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=6379, db=1)\n            orm: StorageORM = RedisORM(client=redis)\n            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 = example_item.save()\n            ```\n        1. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 save() StorageOrm\n            ```python\n                operation_result: OperationResult = 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 = 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 = 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 StorageItem.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=6379, db=17)\n            ...\n            result_of_operation: OperationResult = 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] = 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 RedisORM.get\n    ```python\n        item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15)\n        item_by_object: ExampleItem | None = 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 RedisORM.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] = 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 = 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 = 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(RedisItem):\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 = 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 = 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(RedisItem):\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 = 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 RedisItem, \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 = 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 = 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 \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/storage-orm/archive/refs/heads/master.zip",
        "Homepage": "https://github.com/CyberPhysics-Platform/storage-orm"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "dbf945f1c12f04f5440dbf90d42fd867abad7282094ba8a8a02f42f3d7c50401",
                "md5": "043ebac04a2fa731595e7122e357ff3d",
                "sha256": "0b930b7b1394b2ced60b65040a2768ddd5097ade69bc012ae6c55f9215427484"
            },
            "downloads": -1,
            "filename": "storage_orm-1.4.5-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "043ebac04a2fa731595e7122e357ff3d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 17455,
            "upload_time": "2023-09-18T14:17:04",
            "upload_time_iso_8601": "2023-09-18T14:17:04.588003Z",
            "url": "https://files.pythonhosted.org/packages/db/f9/45f1c12f04f5440dbf90d42fd867abad7282094ba8a8a02f42f3d7c50401/storage_orm-1.4.5-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "42239c305a88902c80b60070d00759240273b372737e6342c2caefbcc55f2eb4",
                "md5": "28ba95c9fce24afeb652201ef51dc649",
                "sha256": "5c06a5962d0e3e01b44f2ddcc59cde296fb99b74121a6c59046724ae20aa0a99"
            },
            "downloads": -1,
            "filename": "storage_orm-1.4.5.tar.gz",
            "has_sig": false,
            "md5_digest": "28ba95c9fce24afeb652201ef51dc649",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 16240,
            "upload_time": "2023-09-18T14:17:06",
            "upload_time_iso_8601": "2023-09-18T14:17:06.261314Z",
            "url": "https://files.pythonhosted.org/packages/42/23/9c305a88902c80b60070d00759240273b372737e6342c2caefbcc55f2eb4/storage_orm-1.4.5.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2023-09-18 14:17:06",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "CyberPhysics-Platform",
    "github_project": "storage-orm",
    "github_not_found": true,
    "lcname": "storage-orm"
}
        
Elapsed time: 0.12565s