https://github.com/micmurawski/pynamodb-utils
Pynamodb Utils is a collection of small helper functions, utilities and classes which make common patterns easier. It helped me make my job easier in the past.
https://github.com/micmurawski/pynamodb-utils
aws dynamodb pynamodb query-language search utils-library
Last synced: 10 months ago
JSON representation
Pynamodb Utils is a collection of small helper functions, utilities and classes which make common patterns easier. It helped me make my job easier in the past.
- Host: GitHub
- URL: https://github.com/micmurawski/pynamodb-utils
- Owner: micmurawski
- License: mit
- Created: 2021-01-31T11:32:59.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2024-06-20T14:07:58.000Z (almost 2 years ago)
- Last Synced: 2024-12-11T08:39:24.017Z (over 1 year ago)
- Topics: aws, dynamodb, pynamodb, query-language, search, utils-library
- Language: Python
- Homepage:
- Size: 53.7 KB
- Stars: 7
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Introduction
Pynamodb Utils is a collection of small helper functions, utilities and classes which make common patterns easier. It helped me make my job easier in the past.
[](https://github.com/micmurawski/pynamodb-utils/actions/workflows/release.yml) [](https://pypi.org/project/pynamodb-utils/)
## Examples are:
- Models with automatic ``updated_at``, ``created_at`` and ``deleted_at`` fields
- Attributes for enums and dynamic mappings
- Class with methods that allow to generate from JSON/dict query/scan conditions
## To install:
Run ``pip install pynamodb-utils`` or execute ``python setup.py install`` in the source directory
## Example of Usage
To setup pynamodb models with authomaticly generated timestamps and useful functions allowing serialization of scan conditions from JSON input from API.
```python
from datetime import timezone, datetime
from pynamodb.attributes import UnicodeAttribute
from pynamodb_utils import DynamicMapAttribute, AsDictModel,
JSONQueryModel, TimestampedModel
class CategoryEnum(enum.Enum):
finance = enum.auto()
politics = enum.auto()
class PostCategoryCreatedAtGSI(GlobalSecondaryIndex):
category = EnumAttribute(hash_key=True, enum=CategoryEnum)
created_at = UTCDateTimeAttribute(range_key=True)
class Meta:
index_name = "example-index-name"
projection = AllProjection
class Post(AsDictModel, JSONQueryModel, TimestampedModel):
name = UnicodeAttribute(hash_key=True)
sub_name = UnicodeAttribute(range_key=True)
category = EnumAttribute(enum=CategoryEnum, default=CategoryEnum.finance)
content = UnicodeAttribute()
tags = DynamicMapAttribute(default={})
category_created_at_gsi = PostCategoryCreatedAtGSI()
class Meta:
table_name = 'example-table-name'
TZINFO = timezone.utc
Post.create_table(read_capacity_units=10, write_capacity_units=10)
post = Post(
name='A weekly news.',
sub_name='Shocking revelations',
content='Last week took place...',
category=CategoryEnum.finance,
tags={
"type": "news",
"topics": ["stock exchange", "NYSE"]
}
)
post.save()
condition = Post.make_index_query(
query={
"created_at__lte": str(datetime.now()),
"sub_name__exists": None,
"category__equals": "finance",
"OR": {"tags.type__equals": "news", "tags.topics__contains": ["NYSE"]},
}
) # class method executes query on the most optimal index
print(next(results).as_dict())
```
That lines of code should result with following output
```
{
'name': 'A weekly news.',
'created_at': '2019-01-01 00:00:00+00:00',
'updated_at': '2019-01-01 00:00:00+00:00',
'deleted_at': None,
'content': 'Last week took place...',
'tags': {
'type': 'news',
'topics': ['stock exchange', 'NYSE']
}
}
```
## Links
* https://github.com/pynamodb/PynamoDB
* https://pypi.org/project/pynamodb-utils/