веб-сервисы Amazon — проблема с AWS PHP SDK (DynamoDB)

Недавно DynamoDB выпустил типы документов (список или карта). Посмотреть здесь: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes
или здесь: http://www.allthingsdistributed.com/2014/10/document-model-dynamodb.html

Сейчас я пытаюсь сохранить следующий массив в DynamoDB

array("key"=>"value")

Я использую PHP SDK 2.7.0 и 2.7.2 и 3.0.0 beta (пробовал все, чтобы решить мою проблему, каждый раз, когда возникает одна и та же проблема). Мой код ниже, который хранит две строки работает отлично:

require ("aws2.7.0/aws-autoloader.php");
use Aws\DynamoDb\DynamoDbClient;
$client = DynamoDbClient::factory(array(
'key'    => 'KEY',
'secret' => 'SECRET',
'region' => 'eu-west-1'
));

$result = $client->putItem(array(
'TableName' => 'requests-test',
'Item' => array(
'messageId'      => array('S' => "test-message1"),
'data'      => array('S' => "message-data-here"),
),
)
));

Теперь я пытаюсь сохранить простой массив с типом данных Map вместо строки:

require ("aws2.7.0/aws-autoloader.php");
use Aws\DynamoDb\DynamoDbClient;
$client = DynamoDbClient::factory(array(
'key'    => 'KEY',
'secret' => 'SECRET',
'region' => 'eu-west-1'
));

$result = $client->putItem(array(
'TableName' => 'requests-test',
'Item' => array(
'messageId'      => array('S' => "test-message1"),
'data'      => array('M' => array("key"=>"value")),
),
)
));

это приводит к следующей ошибке:

Неустранимая ошибка: Uncaught Aws \ DynamoDb \ Exception \ DynamoDbException: AWS
Код ошибки: SerializationException, Код состояния: 400, Идентификатор запроса AWS:
8H9URPVBNPCTG4VALA62XXXX3NVV4KQNSO5AEMVJF66Q9ASUAYGX, AWS Тип ошибки:
клиент, сообщение об ошибке AWS: ожидаемый ноль, пользователь-агент:
aws-sdk-php2 / 2.7.0 Guzzle / 3.9.2 curl / 7.36.0 PHP / 5.3.28
/path/aws2.7.0/Aws/Common/Exception/NamespaceExceptionFactory.php
на линии 91

AWS PHP SDK 2.7.0 и выше должен поддерживать тип карты и списка: https://github.com/aws/aws-sdk-php/releases/tag/2.7.0

Как я могу хранить массивы в DynamoDB? Возможно ли это с текущими SDK, или им нужно выпустить обновление для полной поддержки этих новых типов данных? Или проблема в моем коде?

Буду очень признателен за любые комментарии или возможные решения. Заранее спасибо!

0

Решение

В DynamoDB значение документа (список или карта) должно быть значением атрибута.

'Item' => array(
'messageId'      => array('S' => "test-message1"),
'data'      => array('M' => array("key"=>
array('S' => "value"))),
),
)

Точно так же в списке у вас будет это:

array('L' => array(
array('S' => "key"), array('S' => "value")));

Надеюсь, это поможет!

8

Другие решения

Это в PHP

Я был с той же проблемой, и мысль кое-что объясняется здесь и там, это то, что в конце концов решило

$res =$this->dynamodb->updateItem([
'TableName' => 'your_table',
'Key' => [
'key1' => ['N' =>  $detail1,
'key2' => ['S' => $detail2,
"ExpressionAttributeNames" => ["#theList" => "my_list_iten_name"],
"ExpressionAttributeValues" => [
':empty_list' => ['L'=>[]],
':addVal' => [
'L' => [
[
'M' =>  [
'val1' => ['S' => 'one'],
'val2' => ['S' => 'two!!!'],
]
],
[
'M' =>  [
'val1' => ['S' => 'one1'],
'val2' => ['S' => 'two2!!!'],
]
]
]
]
],
'UpdateExpression' => 'SET #theList = list_append(if_not_exists(#theList, :empty_list), :addVal)',
]);
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector