Python for using in-memory storage with ORM
Project description
StorageORM (CyberPhysics)
Установка
pip install storage-orm
Зависимости
Базовый пример использования (все примеры, базовый пример)
- Импорт классов
from storage_orm import StorageORM from storage_orm import RedisORM from storage_orm import RedisItem from storage_orm import OperationResult
- Определить модель
class ExampleItem(RedisItem): """ Атрибуты объекта с указанием типа данных (в процессе сбора данных из БД приводится тип) """ date_time: int any_value: float class Meta: """ Системный префикс записи в Redis Ключи указанные в префиксе обязательны для передачи в момент создания экземпляра """ table = "subsystem.{subsystem_id}.tag.{tag_id}"
- Установить подключение ORM можно двумя способами
- Передать данные для подключения непосредственно в ORM
orm: StorageORM = RedisORM(host="localhost", port=6379, db=1) orm.init()
- Создать подключение redis.Redis и передать его в конструктор
redis: redis.Redis = redis.Redis(host="localhost", port=6379, db=1) orm: StorageORM = RedisORM(client=redis) 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 = example_item.save()
- Использовать метод save() StorageOrm
operation_result: OperationResult = orm.save(item=example_item)
- Использовать групповую вставку записей (пример групповой вставки)
operation_result: OperationResult = orm.bulk_create( items=[example_item1, example_item2] )
- Использовать метод save() созданного экземпляра
- Создать объект на основе модели
- Выборка данных из БД
- для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
table = "subsystem.{subsystem_id}.tag.{tag_id}" ^ ^
, напримерexample_items: ExampleItem = exampleitem.get(subsystem_id=3, tag_id=15)
- для выборки необходимо передать аргументы для параметров, которые используются в Meta.table
- Использование нескольких подключений (пример)
- для использования нескольких подключений необходимо в метод StorageItem.using(db_instance=...) передать
подготовленное соединение с БД Redis, например
redis_another: redis.Redis = redis.Redis(host="localhost", port=6379, db=17) ... result_of_operation: OperationResult = example_item.using(db_instance=redis_another).save()
- для использования нескольких подключений необходимо в метод StorageItem.using(db_instance=...) передать
подготовленное соединение с БД Redis, например
- Поиск по списку значений (пример)
- для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значений
getted_items: list[ExampleItem] = ExampleItem.filter(subsystem_id__in=[21, 23], tag_id=15)
- для поиска записей по параметру, находящемуся в списке значений, необходимо параметр дополнить суффиксом __in, в
который необходимо передать список искомых значений
- Поиск по предварительно подготовленному объекту (пример)
- для поиска записи указанным образом, необходимо создать объект с параметрами, необходимыми для поиска и передать его в метод RedisORM.get
item: ExampleItem = ExampleItem(subsystem_id=1, tag_id=15) item_by_object: ExampleItem | None = ExampleItem.get(_item=item)
- Поиск по предварительно подготовленным объектам (пример)
- для поиска записи указанным образом, необходимо создать объекты с параметрами, необходимыми для поиска и передать их списком в метод RedisORM.filter
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)
- Удаление одного объекта (пример)
example_item: ExampleItem = ExampleItem(subsystem_id=3, tag_id=15) result_of_operation: OperationResult = example_item.delete()
- Удаление нескольких объектов одновременно (пример)
result_of_operation: OperationResult = orm.bulk_delete(items=example_items)
- Добавление объектов с ограниченным временем жизни (пример)
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)
- Добавление одной записи во фрейм (пример)
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)
- Групповое добавление записей во фрейм (пример)
- записи могут быть разнородными (должны являться наследником RedisItem, но при этом они могут быть определены различными друг от друга классами)
... result_of_operation: OperationResult = 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 = 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_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
storage_orm-1.4.5.tar.gz
(16.2 kB
view details)
Built Distribution
File details
Details for the file storage_orm-1.4.5.tar.gz
.
File metadata
- Download URL: storage_orm-1.4.5.tar.gz
- Upload date:
- Size: 16.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.5
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5c06a5962d0e3e01b44f2ddcc59cde296fb99b74121a6c59046724ae20aa0a99 |
|
MD5 | 28ba95c9fce24afeb652201ef51dc649 |
|
BLAKE2b-256 | 42239c305a88902c80b60070d00759240273b372737e6342c2caefbcc55f2eb4 |
File details
Details for the file storage_orm-1.4.5-py3-none-any.whl
.
File metadata
- Download URL: storage_orm-1.4.5-py3-none-any.whl
- Upload date:
- Size: 17.5 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 | 0b930b7b1394b2ced60b65040a2768ddd5097ade69bc012ae6c55f9215427484 |
|
MD5 | 043ebac04a2fa731595e7122e357ff3d |
|
BLAKE2b-256 | dbf945f1c12f04f5440dbf90d42fd867abad7282094ba8a8a02f42f3d7c50401 |