Skip to main content

Python for using in-memory storage with ORM

Project description

AioStorageORM (CyberPhysics)

Upload pypi Linting & Pytest

Установка
    pip install aiostorage-orm
Зависимости
Базовый пример использования (все примеры, базовый пример)
  1. Импорт классов
        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
    
  2. Определить модель
        class ExampleItem(AIORedisItem):
            """
                Атрибуты объекта с указанием типа данных
                  (в процессе сбора данных из БД приводится тип)
            """
            date_time: int
            any_value: float
    
            class Meta:
                """
                    Системный префикс записи в Redis
                    Ключи указанные в префиксе обязательны для
                      передачи в момент создания экземпляра
                """
                table = "subsystem.{subsystem_id}.tag.{tag_id}"
    
  3. Установить подключение ORM можно двумя способами
    1. Передать данные для подключения непосредственно в ORM
          orm: AIOStorageORM = AIORedisORM(host="localhost", port=8379, db=1)
          await orm.init()
      
    2. Создать подключение redis.Redis и передать его в конструктор
          redis: redis.Redis = redis.Redis(host="localhost", port=8379, db=1)
          orm: AIOStorageORM = AIORedisORM(client=redis)
          await orm.init()
      
  4. Добавление/редактирование записи (ключами записи являются параметры, указанные в Meta.table модели)
    1. Создать объект на основе модели
          example_item: ExampleItem = ExampleItem(
              subsystem_id=3,
              tag_id=15,
              date_time=100,
              any_value=17.
          )
      
    2. Выполнить вставку можно несколькими способами
      1. Использовать метод save() созданного экземпляра
            operation_result: OperationResult = await example_item.save()
        
      2. Использовать метод save() AIOStorageOrm
            operation_result: OperationResult = await orm.save(item=example_item)
        
      3. Использовать групповую вставку записей (пример групповой вставки)
            operation_result: OperationResult = await orm.bulk_create(
                items=[example_item1, example_item2]
            )
        
  5. Выборка данных из БД
    • для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
          table = "subsystem.{subsystem_id}.tag.{tag_id}"
                                   ^               ^
      
      , например
          example_items: ExampleItem = await exampleitem.get(subsystem_id=3, tag_id=15)
      
  6. Использование нескольких подключений (пример)
    • для использования нескольких подключений необходимо в метод AIOStorageItem.using(db_instance=...) передать подготовленное соединение с БД Redis, например
          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()
      
  7. Поиск по списку значений (пример)
    • для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в который необходимо передать список искомых значений
          getted_items: list[ExampleItem] = await ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)
      
  8. Поиск по предварительно подготовленному объекту (пример)
    • для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать его в метод AIORedisORM.get
        item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15)
        item_by_object: ExampleItem | None = await ExampleItem.get(_item=item)
    
  9. Поиск по предварительно подготовленным объектам (пример)
    • для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать их списком в метод AIORedisORM.filter
        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)
    
  10. Удаление одного объекта (пример)
        example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15)
        result_of_operation: OperationResult = await example_item.delete()
    
  11. Удаление нескольких объектов одновременно (пример)
        result_of_operation: OperationResult = await orm.bulk_delete(items=example_items)
    
  12. Добавление объектов с ограниченным временем жизни (пример)
        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)
    
  13. Добавление одной записи во фрейм (пример)
        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)
    
  14. Групповое добавление записей во фрейм (пример)
    • записи могут быть разнородными (должны являться наследником AIORedisItem, но при этом они могут быть определены различными друг от друга классами)
        ...
        result_of_operation: OperationResult = await orm.frame.add(item_or_items=[example_item, example_item_2])
    
  15. Сбор данных из фрейма (пример)
    • данные из фрейма можно получить только списком (list[ExampleItem])
    • получение данных из фрейма ограничивается агрументами start_index и end_index (включительно, т.е. самый старый элемент get(ExampleItem(), 0, 0), самый последний добавленный get(ExampleItem(), -1, -1))
        ...
        result_of_operation: OperationResult = await orm.frame.get(item=example_item)
    
Запуск примеров
    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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

aiostorage_orm-1.4.5.tar.gz (16.8 kB view details)

Uploaded Source

Built Distribution

aiostorage_orm-1.4.5-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

File details

Details for the file aiostorage_orm-1.4.5.tar.gz.

File metadata

  • Download URL: aiostorage_orm-1.4.5.tar.gz
  • Upload date:
  • Size: 16.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for aiostorage_orm-1.4.5.tar.gz
Algorithm Hash digest
SHA256 088bb4c54f7111698f987cf1cae2332879e6f4ec5ccb4e94531330d4e47ef1a6
MD5 854f25f09e78ea98b988dd995fca5dda
BLAKE2b-256 42aecf47395dbd41007329293012f5448a35b44455321f822b5631d0f0af667f

See more details on using hashes here.

File details

Details for the file aiostorage_orm-1.4.5-py3-none-any.whl.

File metadata

File hashes

Hashes for aiostorage_orm-1.4.5-py3-none-any.whl
Algorithm Hash digest
SHA256 d2fcb44760a0941a13c332c8436713cf500d20526c6b3e132f23f7f6c1cf8370
MD5 19124de9fbe51c76ad1e7dced9900b2c
BLAKE2b-256 a36557b089858a76f778156991100328f87db353e88db587ff13537bc9e3e26e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page