【问题标题】:Using DynamoDB's updateItem with a numeric value将 DynamoDB 的 updateItem 与数值一起使用
【发布时间】:2021-01-31 10:44:33
【问题描述】:

我正在尝试使用 updateItem 作为 PHP AWS SDK 版本 3 的一部分更新 DynamoDB 中的记录。

我要更新的字段应该包含一个数值。

如果我运行此代码,我会收到错误:

$params = array(
    'TableName' => $table,
    'Key' => array('id' => array('S' => $id) ),
    'UpdateExpression' => 'set newField = :val',
    'ExpressionAttributeValues' => array(
        ':val'  => array('N' => 99)
    ),
    'ReturnValues' => 'ALL_NEW'
);

print_r($params);

$result = $client->updateItem($params);

错误:

Client error: `POST https://dynamodb.eu-west-2.amazonaws.com` resulted in a `400 Bad Request` 
response: {"__type":"com.amazon.coral.service#SerializationException","Message":"NUMBER_VALUE cannot be converted to String"}

但如果我修改:

':val'  => array('N' => 99)

成为:

':val'  => array('N' => "99")

或者

':val'  => array('N' => (string)99)

然后请求成功,更新Dynamo。如果我转到 Dynamo 控制台,那么我可以看到更新的记录,并且该字段正确显示为 Number 类型。

是否有更好的方法来处理使用整数更新 DynamoDB 记录的过程,将其转换为字符串,以便 PHP SDK 工作似乎不是最好的方法?

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb aws-php-sdk


    【解决方案1】:

    所有 DynamoDB SDK afaik 最初都希望数值以字符串形式呈现,但随后各种编组增强功能带来了原生类型支持。

    我不使用 PHP,但请参阅 DynamoDB JSON and Array Marshaling for PHP

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-27
      相关资源
      最近更新 更多