boto3 Dynamodb表更新保存为对象而不是Number

时间:2019-08-04 20:39:55

标签: amazon-dynamodb boto3

我在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数据类型?

1 个答案:

答案 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'
        }
    }
)