Decimals and DynamoDB
A story on how I ended up adding ducktape code and putting it in production. It still hurts.
A short note on DynamoDB of AWS and how it suprisingly gives Decimals
when you extract records. And forced me to write ducktape-code.
The story
DynamoDB implicitely converts integers to decimals. Decimals cause some problems in Python code since it is not a basic type. For example, json.dumps()
doesn’t work anymore.
- You put a Python datastructure with lists and dictionairies into DynamoDB with strings and integers.
- DynamoDB converts and stores the datastructure
- You load an entry from DynamoDB
- …it suddenly contains
Decimals
instead of integers - …and
json.dumps()
crashes (among others)
The ‘solution’
I now simply convert decimals back to float
and int
. The alternative of storing the object as a string (convert to JSON) I dislike. Figuring out how to configure DynamoDB…I couldn’t find a decent way within half an hour. I did find a discussion on a feature request to disable decimals and/or find some sane way to work with it, but no solutions.
So I wrote a little function to convert a dictionary:
def convert_decimal(dictionary):
""" Converts decimals to float and int. """
for key in dictionary.keys():
value = dictionairy[key]
if isinstance(value, Decimal):
if v % 1 == 0:
dictionary[key] = int(value)
else:
dictionary[key] = float(value)
return dictionary