Request Mixins¶
Request Mixins are classes that define the functionality of each Request subclass. All subclasses inherit from the BaseRequest, which define the constructor and basic helpers to build the request.
BaseRequest¶
-
class
cerami.request.mixins.base_request.BaseRequest(client, tablename='', request_attributes=None, reconstructor=None)¶ The Base Class for all requests
It provides the default constructor and methods for building requests.
-
client¶ A
boto3.client('dynamodb')
-
request_attributes¶ a dict of SearchAttribute objects whose keys represent options that can be passed to client upon execution For example, it may include a FilterExpression key whose value is a SearchAttribute that resolves to a string of filters. This is typically None but can be used to manually build requests:
Parent.scan.filter(Parent.name == 'Mom').project(Parent.name) # The search_attributes can be manually specified ScanRequest(client=client, tablename='parents', search_attributes={ 'FilterExpression': SearchAttribute('name = Mom'), 'ProjectionExpression': SearchAttribute('name'), })
-
reconstructor¶ a Reconstructor object
-
__init__(client, tablename='', request_attributes=None, reconstructor=None)¶ constructor for base request
- Parameters
client – A
boto3.client('dynamodb')tablename – the name of the table to perform the request on
request_attributes –
a dict of SearchAttribute objects whose keys represent options that can be passed to client upon execution For example, it may include a FilterExpression key whose value is a SearchAttribute that resolves to a string of filters. This is typically None but can be used to manually build requests:
Parent.scan.filter(Parent.name == 'Mom').project(Parent.name) # The search_attributes can be manually specified ScanRequest(client=client, tablename='parents', search_attributes={ 'FilterExpression': SearchAttribute('name = Mom'), 'ProjectionExpression': SearchAttribute('name'), })
reconstructor – a Reconstructor object
-
add_attribute(attr_class, name, value)¶ add a search attribute to a to the request_attributes dict
All search attributes must be unique keys. When the key already exists, it will update that value by calling
add(). Depending on theattr_class, this can overwrite, append, change the value of the existing search attribute.- Parameters
attr_class – a SearchAttribute class
name – the name of the attribute
value – the value that will be added to the SearchAttribute
For example:
Person.scan.limit(10) # or ... Person.scan.add_attribute(SearchAttribute, 'Limit', 10)
-
build()¶ build the dict used by dynamodb
- Returns
a dict whose keys matching the keys of the request_attributes and whose values are string versions of each attribute
For example:
User.scan.filter(User.email == 'test@test.com').build() { "TableName": "Users", "FilterExpression": "#__email = :_email_dpxqm", "ExpressionAttributeNames": { "#__email": "email" }, "ExpressionAttributeValues": { ":_email_dpxqm": { "S": "test@test.com" } } }
-
Filterable¶
-
class
cerami.request.mixins.Filterable¶ A mixin to add the filter method
-
filter(*expressions)¶ return a new Request setup with filter attributes
Adds the FilterExpression, ExpressionAttributeNames, and ExpressionAttributeValue to the request_attributes dict
- Parameters
*expressions – a list of
BaseExpressions- Returns
the caller of the method. This allows for chaining
For example:
Person.scan.filter(Person.name == 'Zac').filter(Person.age < 50).build() { "TableName": "people", "FilterExpression": "#__name = :_name_pwmbx and #__age < :_age_twtue", "ExpressionAttributeNames": { "#__name": "name", "#__age": "age" }, "ExpressionAttributeValues": { ":_name_pwmbx": { "S": "Zac" }, ":_age_twtue": { "N": "50" } } }
-
Keyable¶
-
class
cerami.request.mixins.Keyable¶ A mixin to add the key method
-
key(*expressions)¶ return a new Request setup with the Key attribute
Adds the Key to the request_attributes dict
- Parameters
*expressions – a list of
BaseExpressions- Returns
the caller of the method. This allows for chaning
For example:
Person.get.key(Person.email == 'test@test.com').build() { "TableName": "people", "Key": { "email": { "S": "test@test.com" } } }
-
Limitable¶
-
class
cerami.request.mixins.Limitable¶ A mixin to add the limit method
-
limit(limit_number)¶ return a new Request setup with the limit attribute
Adds the Limit to the request_attributes dict
- Parameters
limit_number – a number representing the maximum items to be returned
- Returns
the caller of the method. This allows for chaining
For example:
Person.scan.limit(10).build() { "TableName": "people", "Limit": 10 }
-
Pageable¶
-
class
cerami.request.mixins.Pageable¶ A mixin to add the start_key method
Pageable requests can be paginated by passing in an ExclusiveStartKey attribute.
-
start_key(key)¶ return a new Request setup with the ExclusiveStartKey attribute
- Parameters
key – A dict representing the exclusive start key. This key is _excluded_ from the response. Typically, this key is auto-generated from a previous response of a request.
For example:
request = Person.scan \ .limit(1) \ .start_key({"email": {"S": "test@test.com"}}) request.build() { "TableName": "people", "Limit": 1, "ExclusiveStartKey": { "email": { "S": "test@test.com", }, }, } # you can use the responses exclusive_start_key to continually paginate response = request.execute() next_response = request.start_key(response.last_evaludated_key).execute()
-
Projectable¶
-
class
cerami.request.mixins.Projectable¶ A mixin to add the project method
-
project(*datatypes_or_expressions)¶ return a new Request setup with project attributes
Adds the ProjectionExpression, ExpressionAttributeNames to the request_attributes dict
- Parameters
*datatypes – a list of datatypes. List.index() and Map.key() can be passed to project specific nested attributes
- Returns
the caller of the method. This allows for chaining
For example:
Person.scan.project(Person.name, Person.email) { "TableName": "people", "ProjectionExpression": "#__name :_name_lwxqt, #__email :_email_dvsyj", "ExpressionAttributeNames": { "#__name": "name", "#__email": "email" } }
-
Returnable¶
-
class
cerami.request.mixins.Returnable¶ A mixin to add the returns method
-
returns(value)¶ return the Request setup with ReturnValues attribute
Adds the ReturnValues to the request attributes dict
- Parameters
value – NONE | ALL_OLD | UPDATED_OLD | ALL_NEW | UPDATED_NEW
- Returns
the caller of the method. This allows for chaining
For example:
from cerami.request.return_values import UPDATED_NEW Person.update \ .key(Person.email == 'test@test.com') \ .set(Person.name, 'new name') \ .returns(UPDATED_NEW) \ .build() { "TableName": "people", "ReturnValues": "UPDATED_NEW", "Key": { "email": { "S": "test@test.com" } }, "UpdateExpression": "SET #__name = :_name_zhvzz", "ExpressionAttributeNames": { "#__name": "name" }, "ExpressionAttributeValues": { ":_name_zhvzz": { "S": "new name" } } }
-