#2562 - DynamoDB - allow updates to be of a different type
This commit is contained in:
parent
1f6b600d49
commit
993819bd41
@ -77,6 +77,7 @@ class DynamoType(object):
|
|||||||
attr, list_index = attribute_is_list(attr)
|
attr, list_index = attribute_is_list(attr)
|
||||||
if not key:
|
if not key:
|
||||||
# {'S': value} ==> {'S': new_value}
|
# {'S': value} ==> {'S': new_value}
|
||||||
|
self.type = new_value.type
|
||||||
self.value = new_value.value
|
self.value = new_value.value
|
||||||
else:
|
else:
|
||||||
if attr not in self.value: # nonexistingattribute
|
if attr not in self.value: # nonexistingattribute
|
||||||
|
@ -3319,3 +3319,66 @@ def _create_user_table():
|
|||||||
TableName="users", Item={"username": {"S": "user3"}, "foo": {"S": "bar"}}
|
TableName="users", Item={"username": {"S": "user3"}, "foo": {"S": "bar"}}
|
||||||
)
|
)
|
||||||
return client
|
return client
|
||||||
|
|
||||||
|
|
||||||
|
@mock_dynamodb2
|
||||||
|
def test_update_item_if_original_value_is_none():
|
||||||
|
dynamo = boto3.resource("dynamodb", region_name="eu-central-1")
|
||||||
|
dynamo.create_table(
|
||||||
|
AttributeDefinitions=[{"AttributeName": "job_id", "AttributeType": "S"}],
|
||||||
|
TableName="origin-rbu-dev",
|
||||||
|
KeySchema=[{"AttributeName": "job_id", "KeyType": "HASH"}],
|
||||||
|
ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
|
||||||
|
)
|
||||||
|
table = dynamo.Table("origin-rbu-dev")
|
||||||
|
table.put_item(Item={"job_id": "a", "job_name": None})
|
||||||
|
table.update_item(
|
||||||
|
Key={"job_id": "a"},
|
||||||
|
UpdateExpression="SET job_name = :output",
|
||||||
|
ExpressionAttributeValues={":output": "updated",},
|
||||||
|
)
|
||||||
|
table.scan()["Items"][0]["job_name"].should.equal("updated")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_dynamodb2
|
||||||
|
def test_update_nested_item_if_original_value_is_none():
|
||||||
|
dynamo = boto3.resource("dynamodb", region_name="eu-central-1")
|
||||||
|
dynamo.create_table(
|
||||||
|
AttributeDefinitions=[{"AttributeName": "job_id", "AttributeType": "S"}],
|
||||||
|
TableName="origin-rbu-dev",
|
||||||
|
KeySchema=[{"AttributeName": "job_id", "KeyType": "HASH"}],
|
||||||
|
ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
|
||||||
|
)
|
||||||
|
table = dynamo.Table("origin-rbu-dev")
|
||||||
|
table.put_item(Item={"job_id": "a", "job_details": {"job_name": None}})
|
||||||
|
table.update_item(
|
||||||
|
Key={"job_id": "a"},
|
||||||
|
UpdateExpression="SET job_details.job_name = :output",
|
||||||
|
ExpressionAttributeValues={":output": "updated",},
|
||||||
|
)
|
||||||
|
table.scan()["Items"][0]["job_details"]["job_name"].should.equal("updated")
|
||||||
|
|
||||||
|
|
||||||
|
@mock_dynamodb2
|
||||||
|
def test_allow_update_to_item_with_different_type():
|
||||||
|
dynamo = boto3.resource("dynamodb", region_name="eu-central-1")
|
||||||
|
dynamo.create_table(
|
||||||
|
AttributeDefinitions=[{"AttributeName": "job_id", "AttributeType": "S"}],
|
||||||
|
TableName="origin-rbu-dev",
|
||||||
|
KeySchema=[{"AttributeName": "job_id", "KeyType": "HASH"}],
|
||||||
|
ProvisionedThroughput={"ReadCapacityUnits": 1, "WriteCapacityUnits": 1},
|
||||||
|
)
|
||||||
|
table = dynamo.Table("origin-rbu-dev")
|
||||||
|
table.put_item(Item={"job_id": "a", "job_details": {"job_name": {"nested": "yes"}}})
|
||||||
|
table.put_item(Item={"job_id": "b", "job_details": {"job_name": {"nested": "yes"}}})
|
||||||
|
table.update_item(
|
||||||
|
Key={"job_id": "a"},
|
||||||
|
UpdateExpression="SET job_details.job_name = :output",
|
||||||
|
ExpressionAttributeValues={":output": "updated"},
|
||||||
|
)
|
||||||
|
table.get_item(Key={"job_id": "a"})["Item"]["job_details"][
|
||||||
|
"job_name"
|
||||||
|
].should.be.equal("updated")
|
||||||
|
table.get_item(Key={"job_id": "b"})["Item"]["job_details"][
|
||||||
|
"job_name"
|
||||||
|
].should.be.equal({"nested": "yes"})
|
||||||
|
Loading…
Reference in New Issue
Block a user