Home > Net >  How does one automatically format a returned dynamodb item so that it can be put back into dynamodb
How does one automatically format a returned dynamodb item so that it can be put back into dynamodb

Time:10-18

dynamodb yields an item in a string format:

cdb = boto3.client('dynamodb', region_name='us-west-2')
db = boto3.resource('dynamodb', region_name='us-west-2')
table = db.Table('my-table')
response = table.scan()
my_data = response['Items']
foo = my_data[0]
print(foo)

#  {'theID': 'fffff8f-dfsadfasfds-fsdsaf', 'theNumber': Decimal('1')}

Now, when I treat this like a black-box unit, do nothing, and return it to the db via put-item, I'll get many errors indicating none of the values in the dictionary are the expected type:

cdb.put_item(TableName='my-table', Item=foo, ReturnValues="ALL_OLD")

# many errors

I'd like to rely on boto3 to do everything and avoid manipulating the values if possible. Is there a utility available that will convert a response item into the format it needs to be to be placed back in the db?

CodePudding user response:

You should use your table resource to write items because you also use it to read.

Something like this should do the trick:

table.put_item(Item=foo, ReturnValues="ALL_OLD")

You're reading the data using the higher-level resource API, which maps many native Python Types to DynamoDB types, and trying to write using the lower-level client API, which doesn't do that.

The simple solution is also to use the resource-API to write, and it will perform the mappings.

(I'm inferring this based on your method signature for put_item, the question is not overly clear...)

CodePudding user response:

Apparently there is also a serializer that can be used:

from boto3.dynamodb.types import TypeSerializer
  • Related