DynamoQuery
Helper for building Boto3 DynamoDB queries.
Installation
python -m pip install dynamoquery
Usage
You can find commented usage examples in examples directory.
DynamoQuery
import boto3
from dynamo_query import DynamoQuery, DataTable
table_resource = boto3.resource("dynamodb").Table('people')
query = DynamoQuery.build_scan(
filter_expression=ConditionExpression('first_name') & ('last_name', 'in'),
).limit(
5,
).projection(
'first_name', 'last_name', 'age',
).table(
table_resource=table_resource,
table_keys=('pk', ),
)
...
data = {
'first_name': 'John',
'last_name': ['Cena', 'Doe', 'Carmack'],
}
result_data_table = query.execute_dict(data)
for record in result_data_table.get_records():
print(record)
data_table = DataTable.create().add_record(
{"pk": "my_pk"},
{"pk": "my_pk2"},
{"pk": "my_pk3"},
)
result_data_table = query.execute(data_table)
for record in result_data_table.get_records():
print(record)
DynamoTable
from typing import Optional
from dynamo_query import DynamoTable, DynamoDictClass
@dataclass
class UserRecord(DynamoDictClass):
pk: str
email: str
name: str
points: Optional[int] = None
@DynamoDictClass.compute_key("pk")
def get_pk(self) -> str:
return self.email
class UserTable(DynamoTable[UserRecord]):
table_keys = {'pk'}
record_class = UserRecord
@property
def table(self) -> Any:
return boto3.resource("dynamodb").Table("user_table")
user_table = UserTable()
user_table.upsert_record(
UserRecord(
email="user@gmail.com",
name="John User",
age=12,
)
)
for user_record in user_table.scan():
print(user_record)
Development
Install dependencies with pipenv
python -m pip install pipenv
pipenv install -d
Enable pylint
and mypy
checks in your IDE.
Run unit tests and linting.
./scripts/before_commit.sh
Add false-positive unused entities to vulture
whitelist
vulture dynamo_query --make-whitelist > vulture_whitelist.py
VSCode
Recommended .vscode/settings.json
{
"python.pythonPath": "<pipenv_path>/bin/python",
"python.linting.pylintEnabled": true,
"python.linting.enabled": true,
"python.linting.mypyEnabled": true,
"python.formatting.provider": "black"
}
PyCharm
- Install
mypy
unofficial extension - Install
black
extension, enable format on save - Run
pylint
on save
Versioning
dynamo_query
version follows Semantic Versioning.