Python for using in-memory storage with ORM
Project description
AioStorageORM (CyberPhysics)
Установка
pip install aiostorage-orm
Зависимости
Базовый пример использования (все примеры, базовый пример)
- Импорт классов
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
- Определить модель
class ExampleItem(AIORedisItem): """ Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип) """ date_time: int any_value: float class Meta: """ Системный префикс записи в Redis Ключи указанные в префиксе обязательны для передачи в момент создания экземпляра """ table = "subsystem.{subsystem_id}.tag.{tag_id}"
- Установить подключение ORM можно двумя способами
- Передать данные для подключения непосредственно в ORM
orm: AIOStorageORM = AIORedisORM(host="localhost", port=8379, db=1) await orm.init()
- Создать подключение redis.Redis и передать его в конструктор
redis: redis.Redis = redis.Redis(host="localhost", port=8379, db=1) orm: AIOStorageORM = AIORedisORM(client=redis) await orm.init()
- Передать данные для подключения непосредственно в ORM
- Добавление/редактирование записи (ключами записи являются параметры, указанные в Meta.table модели)
- Создать объект на основе модели
example_item: ExampleItem = ExampleItem( subsystem_id=3, tag_id=15, date_time=100, any_value=17. )
- Выполнить вставку можно несколькими способами
- Использовать метод save() созданного экземпляра
operation_result: OperationResult = await example_item.save()
- Использовать метод save() AIOStorageOrm
operation_result: OperationResult = await orm.save(item=example_item)
- Использовать групповую вставку записей (пример групповой вставки)
operation_result: OperationResult = await orm.bulk_create( items=[example_item1, example_item2] )
- Использовать метод save() созданного экземпляра
- Создать объект на основе модели
- Выборка данных из БД
- для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
table = "subsystem.{subsystem_id}.tag.{tag_id}" ^ ^
, напримерexample_items: ExampleItem = await exampleitem.get(subsystem_id=3, tag_id=15)
- для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
- Использование нескольких подключений (пример)
- для использования нескольких подключений необходимо в метод 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()
- для использования нескольких подключений необходимо в метод AIOStorageItem.using(db_instance=...) передать
подготовленное соединение с БД Redis, например
- Поиск по списку значений (пример)
- для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значений
getted_items: list[ExampleItem] = await ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)
- для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значений
- Поиск по предварительно подготовленному объекту (пример)
- для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать его в метод AIORedisORM.get
item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15) item_by_object: ExampleItem | None = await ExampleItem.get(_item=item)
- Поиск по предварительно подготовленным объектам (пример)
- для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать их списком в метод 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)
- Удаление одного объекта (пример)
example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15) result_of_operation: OperationResult = await example_item.delete()
- Удаление нескольких объектов одновременно (пример)
result_of_operation: OperationResult = await orm.bulk_delete(items=example_items)
- Добавление объектов с ограниченным временем жизни (пример)
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)
- Добавление одной записи во фрейм (пример)
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)
- Групповое добавление записей во фрейм (пример)
- записи могут быть разнородными (должны являться наследником AIORedisItem, но при этом они могут быть определены различными друг от друга классами)
... result_of_operation: OperationResult = await orm.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 = 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
Release history Release notifications | RSS feed
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)
Built Distribution
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
Algorithm | Hash digest | |
---|---|---|
SHA256 | 088bb4c54f7111698f987cf1cae2332879e6f4ec5ccb4e94531330d4e47ef1a6 |
|
MD5 | 854f25f09e78ea98b988dd995fca5dda |
|
BLAKE2b-256 | 42aecf47395dbd41007329293012f5448a35b44455321f822b5631d0f0af667f |
File details
Details for the file aiostorage_orm-1.4.5-py3-none-any.whl
.
File metadata
- Download URL: aiostorage_orm-1.4.5-py3-none-any.whl
- Upload date:
- Size: 18.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | d2fcb44760a0941a13c332c8436713cf500d20526c6b3e132f23f7f6c1cf8370 |
|
MD5 | 19124de9fbe51c76ad1e7dced9900b2c |
|
BLAKE2b-256 | a36557b089858a76f778156991100328f87db353e88db587ff13537bc9e3e26e |