我在boto3中有这个UpdateQUery
dynamo.update_item(
Table='table1',
Key={
'partition_key': id,
'sort_key': id_2
},
UpdateExpression=f"set {attribute} = :val",
ExpressionAttributeValues={
":val": {"N": f"{value}"}
},
ReturnValues="UPDATED_NEW"
)
我希望它像
{
"total": 5,
"time": 80,
"users": 1,
"app_id": "PRODUCT_ID",
"sort_key": "abcde"
}
但是,它像这样保存
{
"total": {
"N": "5"
},
"time": {
"N": "80"
},
"users": {
"N": "1"
},
"app_id": "PRODUCT_ID",
"sort_key": "abcde"
}
如果我愿意
ExpressionAttributeValues={
":val": value
},
Python json序列化失败
如何将其保存为Number数据类型?
答案 0 :(得分:2)
这是DynamoDB“原始”对象的语法,“ N”告诉您它的类型(在这种情况下为Number)以及它旁边的值被序列化(由于它来自http请求,因此需要序列化)
您可以做的是使用boto3的高级Table对象,该对象将自动为您转换。但这只是一个帮助,最终它将被完全相同地存储。
参考:https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#table
它将自动将Python类型转换为DynamoDB类型,并且您也不需要使用“ ExpressionAttributeValues”,这是一种更加Python化的语法:
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('table1')
table.update_item(
Key={
'partition_key': id,
'sort_key' : id_2
},
AttributeUpdates={
'attribute': {
'Value': value,
'Action': 'DELETE'
}
}
)