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
Metadata
Release files for storage-orm 1.4.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| storage_orm-1.4.5.tar.gz | 16.2 kB | Without provenance | Details for storage_orm-1.4.5.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| storage_orm-1.4.5-py3-none-any.whl | Python 3 | none | any | Details for storage_orm-1.4.5-py3-none-any.whl |
Total release size: 33.7 kB
Release files / storage_orm-1.4.5.tar.gz
| Download URL | storage_orm-1.4.5.tar.gz |
|---|---|
| Size | 16.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
5c06a5962d0e3e01b44f2ddcc59cde296fb99b74121a6c59046724ae20aa0a99
|
|
BLAKE2b-256 checksum How to use checksums |
42239c305a88902c80b60070d00759240273b372737e6342c2caefbcc55f2eb4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.5
|
Release files / storage_orm-1.4.5-py3-none-any.whl
| Download URL | storage_orm-1.4.5-py3-none-any.whl |
|---|---|
| Size | 17.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0b930b7b1394b2ced60b65040a2768ddd5097ade69bc012ae6c55f9215427484
|
|
BLAKE2b-256 checksum How to use checksums |
dbf945f1c12f04f5440dbf90d42fd867abad7282094ba8a8a02f42f3d7c50401
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/4.0.2 CPython/3.11.5
|
Security for storage-orm 1.4.5
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.