# dynamodb_manager
Фреймворк для управления сервисами YandexCloud в serverless режиме на основе библиотеки `botocore` и `pydantic`.
С помощью фреймворка можно создавать объекты таблицы базы данных dynamodb и стандартного хранилища s3. И управлять непосредственно ими с помощью оптимизированного интерфейса. Названия методов идентичны методам библиотеки `botocore`, поэтому работать с этим фреймворком опытным программистам будет не сложно. Поскольку во фреймворке реализована далеко не вся функциональность библиотеки `botocore`, то в методах классов оставлены аргументы `**kwargs`, где вы можете использовать более тонкие запросы к AWS-сервисам YandexCloud. Проект находится в пилотном режиме, поэтому, если есть какие предложения по совершенствованию проекта, буду рад сотрудничеству.
## Работа с базой данных dynamodb
Для создания таблицы нужно определить ключевую схему с помощью класса `KeySchema`. Импортируем и объявим его экземпляр.
```python
from boto_orm.models.db_model import KeySchema
key_schema = KeySchema(HASH='name', RANGE='user_id')
```
Также определим схему таблицы с помощью класса на базе модели `DBModel`. Имена ключей, объявленные в ключевой схеме, должны присутствовать в классе модели.
```python
from boto_orm.models.db_model import DBModel
class Table(DBModel):
name: str
user_id: int
create: float
```
Для ограничения пропускной способности, воспользуйтесь экземпляром класса `ProvisionedThroughput`.
```python
from boto_orm.db_manager import ProvisionedThroughput
prov = ProvisionedThroughput(ReadCapacityUnits=1, WriteCapacityUnits=1)
```
Для работы с сервисами AWS необходимо использование переменных окружения. Для этого создадим файл `boto-orm.yaml` в корневом каталоге со следующим содержимым (example заменить на свои переменные):
```yaml
session:
access_key: 'key example'
secret_key: 'secret example'
db_config:
service_name: 'dynamodb'
endpoint_url: 'https://example.com'
region_name: 'ru-central1'
s3_config:
service_name: 's3'
endpoint_url: 'https://storage.example.com'
region_name: 'ru-central1'
```
Либо создать свой конфиг на базе экземпляров классов `AWSConfig` и `AWSSession`.
```python
from boto_orm.models.config import AWSConfig, AWSSession
session = AWSSession(access_key: str = 'example', secret_key: str = 'example')
config = AWSConfig(service_name: str = 'example', endpoint_url: str = 'example', region_name: str = 'example')
```
Можно создать свой файл конфигурации `.yaml`, для этого необходимо сделать свой наследный класс от `boto_orm.models.config.BaseConfig`.
```py
class Configure(BaseConfig):
session: AWSSession
db_config: AWSConfig
s3_config: AWSConfig
model_config = SettingsConfigDict(yaml_file='.yaml')
```
Создать таблицу можно с помощью метода `create_table` экземпляра класса `DynamodbManage`
```python
from boto_orm.db_manager import DynamodbManage
db = DynamodbManage(table_name='Table_test')
db.create_table(key_schema, attribute=Table, provisioned_throughput=prov)
```
Экземпляр класса `DynamodbManage` имеет следующие аргументы:
```python
resource_name: str # название таблицы
config: Union[AWSConfig, dict] # конфигурация ресурсного клиента:
service_name: Any['dynamodb', 's3'],
endpoint_url: str
region_name: str
session_aws: Union[AWSSession, dict] # конфигурация сессии botocore:
access_key: str
secret_key: str
```
Добавить элемент в таблицу можно с помощью команды:
```python
from boto_orm.models.db_model import DBModel
class Table(DBModel):
name: str
user_id: int
create: float
data = Table(name='Name', user_id=238, create=19.97)
db = DynamodbManage(table_name='Table_test')
db.put_item(data)
```
Запрос по параметрам значений ключей
```python
response = db.query(Key('name').eq(value=['Tso']), range=Key('user_id').eq([239]))
```
Для запроса возможно использование значения только ключа партицирования. Также во фреймворке предусмотрена возможность фильтрации по параметрам, не являющимися ключами:
```python
from boto_orm.filter import Key, Filter
response = db.query(Key('name').eq(value=['Tso']), filters=Filter('user_id').ge(249))
```
Для фильтрации используется экземпляр класса `Filter`, где в качестве параметра используется имя столбца, а значение аргумента вводится в методе.
Для класса `Key` и `Filter` актуальны следующие методы:
* eq - Операция эквивалентности
* ne - Операция отрицания
* begins_with - Операция поиска строки, начинайщийся с value
* le - Операция меньше или равно
* lt - Операция меньше
* ge - Операция больше или равно
* gt - Операция больше
* between - Операция между.
Для операции сканирования базы данных используется метод `scan`.
```python
response = db.scan(filters=Filter('user_id').ge(237))
```
Метод может принимать следующие необязательные аргументы:
* need_args: Optional[List[str]] = None - запрос требуемых аргументов
* filters: Optional[Filter] = None - экземпляр класса Filter, используется для фильтрации значений столбцов в таблице.
Примеры использования низкоуровневых фильтров.
* [Dynamodb scan() using FilterExpression](https://www.iditect.com/faq/python/dynamodb-scan-using-filterexpression.html)
* [Boto3 DynamoDB Tutorial](https://hands-on.cloud/boto3/dynamodb/)
* [Официальная документация](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html)
## Работа с хранилищем s3
Создаём экземпляр клиента `S3Manager` для работы с бакетом
```python
from boto_orm.s3_manager import S3Manager
s3 = S3Manager(bucket_name='serverless-shortener')
```
Для создания бакета можно воспользоваться метода `create_bucket`.
```python
response = s3.create_bucket()
```
Загрузить строку или байты в бакет можно с помощью метода `put_object`.
```py
response = s3.put_object('TEST', name_file='test.txt')
```
Загрузить файл можно указав путь файла в методе `upload_file`:
```py
response = s3.upload_file(file_path='file/test.py', name_file='test.py')
```
Удалить один или несколько объектов можно следующим образом:
```py
response = s3.delete_objects(['manager.py', 'test.txt'])
```
Загрузить список объектов бакета можно с помощью метода `list_objects`
```py
response = s3.list_objects()
```
Загрузить объект файла можно с помощью метода `get_object`
```py
response = s3.get_str_object('index.html')
print(response['Body'].read())
```
В качестве альтернативы можно воспользоваться методом строкового представления загружаемого файла `get_str_object`. Дополнительным параметром можно добавить кодировку.
```py
response = s3.get_str_object('index.html', encoding='utf-8')
```
Raw data
{
"_id": null,
"home_page": null,
"name": "boto-orm",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "NoSQL, boto-client, boto3, botocore, dynamodb, s3, yandex-cloud, ydb",
"author": null,
"author_email": "Yury Soldatov <general-soldatov@mail.ru>",
"download_url": "https://files.pythonhosted.org/packages/99/9a/3d75d88d93220b64c71cc61cdfea222d35dd66185113acbf175796a2d9e4/boto_orm-0.0.4.tar.gz",
"platform": null,
"description": "# dynamodb_manager\n\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 YandexCloud \u0432 serverless \u0440\u0435\u0436\u0438\u043c\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 `botocore` \u0438 `pydantic`.\n\u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 dynamodb \u0438 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 s3. \u0418 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0438\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u043c\u0435\u0442\u043e\u0434\u0430\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 `botocore`, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u0438\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u043e\u043c \u043e\u043f\u044b\u0442\u043d\u044b\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0435 \u0441\u043b\u043e\u0436\u043d\u043e. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u0430 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 `botocore`, \u0442\u043e \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u044b \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b `**kwargs`, \u0433\u0434\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u043d\u043a\u0438\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043a AWS-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c YandexCloud. \u041f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043f\u0438\u043b\u043e\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u0447\u0435\u0441\u0442\u0432\u0443.\n\n## \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 dynamodb\n\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0435\u0432\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 `KeySchema`. \u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0438 \u043e\u0431\u044a\u044f\u0432\u0438\u043c \u0435\u0433\u043e \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440.\n\n```python\nfrom boto_orm.models.db_model import KeySchema\n\nkey_schema = KeySchema(HASH='name', RANGE='user_id')\n\n```\n\u0422\u0430\u043a\u0436\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u0445\u0435\u043c\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0441\u0441\u0430 \u043d\u0430 \u0431\u0430\u0437\u0435 \u043c\u043e\u0434\u0435\u043b\u0438 `DBModel`. \u0418\u043c\u0435\u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0439, \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u043e\u0434\u0435\u043b\u0438.\n\n```python\nfrom boto_orm.models.db_model import DBModel\n\nclass Table(DBModel):\n name: str\n user_id: int\n create: float\n\n```\n\u0414\u043b\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u0438, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435\u0441\u044c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0430 `ProvisionedThroughput`.\n\n```python\nfrom boto_orm.db_manager import ProvisionedThroughput\nprov = ProvisionedThroughput(ReadCapacityUnits=1, WriteCapacityUnits=1)\n```\n\n\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 AWS \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b `boto-orm.yaml` \u0432 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c (example \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435):\n```yaml\nsession:\n access_key: 'key example'\n secret_key: 'secret example'\ndb_config:\n service_name: 'dynamodb'\n endpoint_url: 'https://example.com'\n region_name: 'ru-central1'\ns3_config:\n service_name: 's3'\n endpoint_url: 'https://storage.example.com'\n region_name: 'ru-central1'\n```\n\n\u041b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433 \u043d\u0430 \u0431\u0430\u0437\u0435 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u0432 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 `AWSConfig` \u0438 `AWSSession`.\n\n```python\nfrom boto_orm.models.config import AWSConfig, AWSSession\n\nsession = AWSSession(access_key: str = 'example', secret_key: str = 'example')\nconfig = AWSConfig(service_name: str = 'example', endpoint_url: str = 'example', region_name: str = 'example')\n```\n\n\u041c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 `.yaml`, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043d\u0430\u0441\u043b\u0435\u0434\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u043e\u0442 `boto_orm.models.config.BaseConfig`.\n```py\nclass Configure(BaseConfig):\n session: AWSSession\n db_config: AWSConfig\n s3_config: AWSConfig\n\n model_config = SettingsConfigDict(yaml_file='.yaml')\n```\n\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 `create_table` \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 `DynamodbManage`\n\n```python\nfrom boto_orm.db_manager import DynamodbManage\n\ndb = DynamodbManage(table_name='Table_test')\ndb.create_table(key_schema, attribute=Table, provisioned_throughput=prov)\n```\n\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 `DynamodbManage` \u0438\u043c\u0435\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n```python\nresource_name: str # \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\nconfig: Union[AWSConfig, dict] # \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u043e\u0433\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u0430:\n service_name: Any['dynamodb', 's3'],\n endpoint_url: str\n region_name: str\nsession_aws: Union[AWSSession, dict] # \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 botocore:\n access_key: str\n secret_key: str\n```\n\n\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u044b:\n```python\nfrom boto_orm.models.db_model import DBModel\n\nclass Table(DBModel):\n name: str\n user_id: int\n create: float\n\ndata = Table(name='Name', user_id=238, create=19.97)\ndb = DynamodbManage(table_name='Table_test')\ndb.put_item(data)\n```\n\u0417\u0430\u043f\u0440\u043e\u0441 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043b\u044e\u0447\u0435\u0439\n```python\nresponse = db.query(Key('name').eq(value=['Tso']), range=Key('user_id').eq([239]))\n```\n\u0414\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u044e\u0447\u0430 \u043f\u0430\u0440\u0442\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a\u0436\u0435 \u0432\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u043f\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c, \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0438\u0441\u044f \u043a\u043b\u044e\u0447\u0430\u043c\u0438:\n```python\nfrom boto_orm.filter import Key, Filter\n\nresponse = db.query(Key('name').eq(value=['Tso']), filters=Filter('user_id').ge(249))\n```\n\u0414\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 `Filter`, \u0433\u0434\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430, \u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043c\u0435\u0442\u043e\u0434\u0435.\n\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430 `Key` \u0438 `Filter` \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:\n* eq - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u0438\n* ne - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0438\u0446\u0430\u043d\u0438\u044f\n* begins_with - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u0439\u0449\u0438\u0439\u0441\u044f \u0441 value\n* le - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e\n* lt - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u043d\u044c\u0448\u0435\n* ge - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e\n* gt - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043e\u043b\u044c\u0448\u0435\n* between - \u041e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u043c\u0435\u0436\u0434\u0443.\n\u0414\u043b\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u043a\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u043e\u0434 `scan`.\n```python\nresponse = db.scan(filters=Filter('user_id').ge(237))\n```\n\u041c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n* need_args: Optional[List[str]] = None - \u0437\u0430\u043f\u0440\u043e\u0441 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n* filters: Optional[Filter] = None - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0430\u0441\u0441\u0430 Filter, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\u041f\u0440\u0438\u043c\u0435\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432.\n* [Dynamodb scan() using FilterExpression](https://www.iditect.com/faq/python/dynamodb-scan-using-filterexpression.html)\n* [Boto3 DynamoDB Tutorial](https://hands-on.cloud/boto3/dynamodb/)\n* [\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f](https://botocore.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html)\n\n\n## \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c s3\n\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 `S3Manager` \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0430\u043a\u0435\u0442\u043e\u043c\n```python\nfrom boto_orm.s3_manager import S3Manager\n\ns3 = S3Manager(bucket_name='serverless-shortener')\n```\n\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u0430 `create_bucket`.\n```python\nresponse = s3.create_bucket()\n```\n\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u043b\u0438 \u0431\u0430\u0439\u0442\u044b \u0432 \u0431\u0430\u043a\u0435\u0442 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 `put_object`.\n```py\nresponse = s3.put_object('TEST', name_file='test.txt')\n```\n\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0432 \u043f\u0443\u0442\u044c \u0444\u0430\u0439\u043b\u0430 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 `upload_file`:\n```py\nresponse = s3.upload_file(file_path='file/test.py', name_file='test.py')\n```\n\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:\n```py\nresponse = s3.delete_objects(['manager.py', 'test.txt'])\n```\n\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0431\u0430\u043a\u0435\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 `list_objects`\n```py\nresponse = s3.list_objects()\n```\n\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u0435\u0442\u043e\u0434\u0430 `get_object`\n```py\nresponse = s3.get_str_object('index.html')\nprint(response['Body'].read())\n```\n\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u044b \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 `get_str_object`. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u0434\u0438\u0440\u043e\u0432\u043a\u0443.\n```py\nresponse = s3.get_str_object('index.html', encoding='utf-8')\n```\n",
"bugtrack_url": null,
"license": null,
"summary": "ORM-client with connect to dynamodb-database and s3-storage.",
"version": "0.0.4",
"project_urls": {
"Contacts": "https://t.me/general_soldatov",
"Documentation": "https://github.com/general-soldatov/dynamodb_manager",
"Homepage": "https://github.com/general-soldatov/dynamodb_manager"
},
"split_keywords": [
"nosql",
" boto-client",
" boto3",
" botocore",
" dynamodb",
" s3",
" yandex-cloud",
" ydb"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "7a3fa663b9e11892dc3ead925d9ce6d4760bdf637fc01cdc6f84ece355504e03",
"md5": "5860f94ed521b7a8073833a92f0c5d2c",
"sha256": "cc0aa6673ed093dcdf8689fc88cd58b45e45cd883ed634fd134cb8767f06a94a"
},
"downloads": -1,
"filename": "boto_orm-0.0.4-py3-none-any.whl",
"has_sig": false,
"md5_digest": "5860f94ed521b7a8073833a92f0c5d2c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.9",
"size": 12196,
"upload_time": "2024-11-07T05:40:34",
"upload_time_iso_8601": "2024-11-07T05:40:34.829385Z",
"url": "https://files.pythonhosted.org/packages/7a/3f/a663b9e11892dc3ead925d9ce6d4760bdf637fc01cdc6f84ece355504e03/boto_orm-0.0.4-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "999a3d75d88d93220b64c71cc61cdfea222d35dd66185113acbf175796a2d9e4",
"md5": "a244a8dc1069ba28182f74c92e94322a",
"sha256": "51138b5762c19d4881eab6c967df09d505369020dfe9e787a7d4321f8a088d21"
},
"downloads": -1,
"filename": "boto_orm-0.0.4.tar.gz",
"has_sig": false,
"md5_digest": "a244a8dc1069ba28182f74c92e94322a",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 10473,
"upload_time": "2024-11-07T05:40:37",
"upload_time_iso_8601": "2024-11-07T05:40:37.442426Z",
"url": "https://files.pythonhosted.org/packages/99/9a/3d75d88d93220b64c71cc61cdfea222d35dd66185113acbf175796a2d9e4/boto_orm-0.0.4.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-11-07 05:40:37",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "general-soldatov",
"github_project": "dynamodb_manager",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [],
"lcname": "boto-orm"
}