update_item takes into account ExpressionAttributeNames and ExpressionAttributeValues
ExpressionAttributeNames and ExpressionAttributeValues are no longer ignored during update_item.
This commit is contained in:
parent
a9e54482fc
commit
69888c3baa
@ -109,8 +109,8 @@ class Item(object):
|
|||||||
"Item": included
|
"Item": included
|
||||||
}
|
}
|
||||||
|
|
||||||
def update(self, update_expression):
|
def update(self, update_expression, expression_attribute_names, expression_attribute_values):
|
||||||
ACTION_VALUES = ['SET', 'REMOVE']
|
ACTION_VALUES = ['SET', 'set', 'REMOVE', 'remove']
|
||||||
|
|
||||||
action = None
|
action = None
|
||||||
for value in update_expression.split():
|
for value in update_expression.split():
|
||||||
@ -121,12 +121,15 @@ class Item(object):
|
|||||||
else:
|
else:
|
||||||
# A Real value
|
# A Real value
|
||||||
value = value.lstrip(":").rstrip(",")
|
value = value.lstrip(":").rstrip(",")
|
||||||
|
for k, v in expression_attribute_names.items():
|
||||||
if action == "REMOVE":
|
value = value.replace(k, v)
|
||||||
|
if action == "REMOVE" or action == 'remove':
|
||||||
self.attrs.pop(value, None)
|
self.attrs.pop(value, None)
|
||||||
elif action == 'SET':
|
elif action == 'SET' or action == 'set':
|
||||||
key, value = value.split("=:")
|
key, value = value.split("=")
|
||||||
# TODO deal with other types
|
if value in expression_attribute_values:
|
||||||
|
self.attrs[key] = DynamoType(expression_attribute_values[value])
|
||||||
|
else:
|
||||||
self.attrs[key] = DynamoType({"S": value})
|
self.attrs[key] = DynamoType({"S": value})
|
||||||
|
|
||||||
def update_with_attribute_updates(self, attribute_updates):
|
def update_with_attribute_updates(self, attribute_updates):
|
||||||
@ -583,7 +586,7 @@ class DynamoDBBackend(BaseBackend):
|
|||||||
|
|
||||||
return table.scan(scan_filters, limit, exclusive_start_key)
|
return table.scan(scan_filters, limit, exclusive_start_key)
|
||||||
|
|
||||||
def update_item(self, table_name, key, update_expression, attribute_updates):
|
def update_item(self, table_name, key, update_expression, attribute_updates, expression_attribute_names, expression_attribute_values):
|
||||||
table = self.get_table(table_name)
|
table = self.get_table(table_name)
|
||||||
|
|
||||||
if all([table.hash_key_attr in key, table.range_key_attr in key]):
|
if all([table.hash_key_attr in key, table.range_key_attr in key]):
|
||||||
@ -618,7 +621,7 @@ class DynamoDBBackend(BaseBackend):
|
|||||||
item = table.get_item(hash_value, range_value)
|
item = table.get_item(hash_value, range_value)
|
||||||
|
|
||||||
if update_expression:
|
if update_expression:
|
||||||
item.update(update_expression)
|
item.update(update_expression, expression_attribute_names, expression_attribute_values)
|
||||||
else:
|
else:
|
||||||
item.update_with_attribute_updates(attribute_updates)
|
item.update_with_attribute_updates(attribute_updates)
|
||||||
return item
|
return item
|
||||||
|
@ -395,8 +395,10 @@ class DynamoHandler(BaseResponse):
|
|||||||
key = self.body['Key']
|
key = self.body['Key']
|
||||||
update_expression = self.body.get('UpdateExpression')
|
update_expression = self.body.get('UpdateExpression')
|
||||||
attribute_updates = self.body.get('AttributeUpdates')
|
attribute_updates = self.body.get('AttributeUpdates')
|
||||||
|
expression_attribute_names = self.body.get('ExpressionAttributeNames', {})
|
||||||
|
expression_attribute_values = self.body.get('ExpressionAttributeValues', {})
|
||||||
existing_item = dynamodb_backend2.get_item(name, key)
|
existing_item = dynamodb_backend2.get_item(name, key)
|
||||||
item = dynamodb_backend2.update_item(name, key, update_expression, attribute_updates)
|
item = dynamodb_backend2.update_item(name, key, update_expression, attribute_updates, expression_attribute_names, expression_attribute_values)
|
||||||
|
|
||||||
item_dict = item.to_json()
|
item_dict = item.to_json()
|
||||||
item_dict['ConsumedCapacityUnits'] = 0.5
|
item_dict['ConsumedCapacityUnits'] = 0.5
|
||||||
|
Loading…
x
Reference in New Issue
Block a user