Python &引用;errorMessage";:&引用;[<;class';十进制。不精确';<;class';十进制。四舍五入';];,在更新DynamoDb时
代码如下Python &引用;errorMessage";:&引用;[<;class';十进制。不精确';<;class';十进制。四舍五入';];,在更新DynamoDb时,python,aws-lambda,amazon-dynamodb,Python,Aws Lambda,Amazon Dynamodb,代码如下 import json from decimal import Decimal from pprint import pprint import boto3 def update_movie(title, year, rating=None, plot=None, actors=None, dynamodb=None): if not dynamodb: dynamodb = boto3.resource('dynamodb') table = d
import json
from decimal import Decimal
from pprint import pprint
import boto3
def update_movie(title, year, rating=None, plot=None, actors=None, dynamodb=None):
if not dynamodb:
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('Movies')
response = table.update_item(
Key={
'year': year,
'title': title
},
UpdateExpression="set info.rating=:r, info.plot=:p, info.actors=:a",
ExpressionAttributeValues={
':r': Decimal(rating),
':p': plot,
':a': actors
},
ReturnValues="UPDATED_NEW"
)
return response
def lambda_handler(event, context):
update_response = update_movie(
"Rush", 2013, 8.3, "Car show",
["Daniel", "Chris", "Olivia"])
print("Update movie succeeded:")
pprint(update_response, sort_dicts=False)
在更新dynamodb中的一个密钥时,我得到了下面的错误
"errorMessage": "[<class 'decimal.Inexact'>, <class 'decimal.Rounded'>]",
"errorType": "Inexact",
试一下这个:
表达式属性值={
“:r”:十进制(str(评级)),
“:p”:绘图,
“:a”:演员
},
问题在于DynamoDB的浮点数表示法与Python的不同:
Decimal
类:它应该使用字符串参数而不是浮点参数构造。也就是说,使用十进制(“8.3”)
(注意引号),而不是十进制(8.3)
在上面的代码中,修复这一问题就像将8.3改为“8.3”一样简单,并加上引号
这是最好的办法。另一种不太好的方法是使用十进制(str(8.3)),但要为数字的不精确表示做好准备。此外,使用字符串创建十进制
,可以创建Python不支持的数字。例如,Decimal(“3.1415926535897932384626433832795028841”)
将为您提供38位精度的十进制数字(DynamoDB支持的最大值)-这在Python浮点中是无法做到的。您能检查以下内容吗
update_response = update_movie(
"Rush", 2013, 8.3, "Car show",
["Daniel", "Chris", "Olivia"])
print("Update movie succeeded:")```