Я прочитал документацию, где есть примеры PHP для вставки данных в таблицу dynamicDB с использованием AWS SDK. Однако это для табличных данных. Я пытаюсь вставить данные JSON, то есть пара ключевых значений, где значение является документом JSON. Как мне это сделать ?
Я попробовал следующий код из документа, но он не работает, если значение не является массивом.
<?php require '/home/ubuntu/vendor/autoload.php'; use Aws\DynamoDb\DynamoDbClient; $client = DynamoDbClient::factory(array( 'profile' => 'default', 'region' => 'ap-southeast-1', 'version' => '2012-08-10' )); $id = "key"; $value = '{"subKey":"value"}' $result = $client->putItem(array( 'TableName' => 'myTable', 'Item' => array( 'key' => $value ) ));
Это дало мне следующую ошибку
Fatal error: Uncaught exception 'InvalidArgumentException' with message 'Found 2 errors while validating the input provided for the PutItem operation: [Item][key] must be an associative array. Found string(1) "2" [Item][userId] must be an associative array. Found string(18) "{"subKey":"value"}"' in /home/ubuntu/vendor/aws/aws-sdk-php/src/Api/Validator.php:38 Stack trace: #0 /home/ubuntu/vendor/aws/aws-sdk-php/src/Middleware.php(78): Aws\Api\Validator->validate('PutItem', Object(Aws\Api\StructureShape), Array) #1 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(208): Aws\Middleware::Aws\{closure}(Object(Aws\Command)) #2 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(202): Aws\AwsClient->executeAsync(Object(Aws\Command)) #3 /home/ubuntu/vendor/aws/aws-sdk-php/src/AwsClient.php(167): Aws\AwsClient->execute(Object(Aws\Command)) #4 /var/www/html/dynamoDB.php(25): Aws\AwsClient->__call('putItem', Array) #5 /var/www/html/dynamoDB.php(25): Aws\DynamoDb\DynamoDbClient->putItem(Array) #6 {main} thrown in /home/ubuntu/vendor/aws/aws-sdk-php/src/Api/Validator.php on line 38
DynamoDB требует указать типы AttributeValue с запросом. Вот пример из https://docs.aws.amazon.com/aws-sdk-php/v2/guide/service-dynamodb.html :
$result = $client->putItem(array( 'TableName' => 'errors', 'Item' => array( 'id' => array('N' => '1201'), 'time' => array('N' => $time), 'error' => array('S' => 'Executive overflow'), 'message' => array('S' => 'no vacant areas') ) ));
В качестве примера попробуйте добавить типы DynamoDB:
$result = $client->putItem(array( 'TableName' => 'myTable', 'Item' => array( 'key' => array('S' => $value) ) ));
Где «S» можно заменить на «N», «B», «SS», «NS», «BS», «M», «L» или «BOOL», как определено здесь: https: // docs. aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModel.DataTypes