[英]Class 'WriteRequestBatch' not found error in Codeigniter - AWS php SDK
[英]AWS PHP SDK issue with Dynamodb WriteRequestBatch
我正在試驗適用於Dynamodb的AWS開發工具包的WriteRequestBatch。 下面是我的代碼。 除WriteRequestBatch部分外,其他所有東西都起作用。 我不知道為什么,並且想知道社區是否可以在這里幫助我。 我可能做錯了什么? 我嘗試在此處進行谷歌搜索和搜索,但發現只有8個其他相關問題,但不幸的是這沒有幫助。
這是我的起點。
$ddb_client = DynamoDbClient::factory(array(
'region' => 'us-east-1',
'key' => 'my_key',
'secret' => 'my_secret'
));
$ddb_client->createTable(array(
'TableName' => 'my_table',
'AttributeDefinitions' => array(
array(
'AttributeName' => 'id',
'AttributeType' => 'S'
),
array(
'AttributeName' => 'ns',
'AttributeType' => 'S'
)
),
'KeySchema' => array(
array(
'AttributeName' => 'id',
'KeyType' => 'HASH'
),
array(
'AttributeName' => 'ns',
'KeyType' => 'RANGE'
)
),
'ProvisionedThroughput' => array(
'ReadCapacityUnits' => 10,
'WriteCapacityUnits' => 10
)
));
$response = $ddb_client->putItem(array(
"TableName" => "my_table",
"Item" => array(
"id" => array("S" => "exp_id"),
"ns" => array("S" => "exp_ns"),
"version" => array("N" => "0"),
),
));
$item = $response['Item'];
$item['version']['N'] = '1';
$put_batch = WriteRequestBatch::factory($ddb_client);
$put_request = new PutRequest(
array(
"Item" => $item,
"Expected" => array(
"version" => array(
"ComparisonOperator" => "EQ",
"AttributeValueList" => array(
array("N" => "0")
)
),
),
),
"my_table"
);
$putBatch->add($put_request);
$putBatch->flush();
這代替了WriteRequestBatch。 與使用WriteRequestBatch相比,我只需要管理批處理就可以了:
$response = $ddb_client->batchWriteItem(array(
"RequestItems" => array(
"my_table" => array(
array(
"PutRequest" => array(
"Item" => $item,
"Expected" => array(
"version" => array(
"ComparisonOperator" => "EQ",
"AttributeValueList" => array(
array("S" => "0")
)
),
),
)
)
)
)
));
因為您當前在代碼周圍沒有任何“嘗試/捕獲”錯誤處理,所以您可能無法獲得有關錯誤的良好信息。
我在代碼上放置了try / catch塊,發現該表創建得很好,但是對putItem的調用由於以下原因而失敗: 找不到請求的資源
創建表時,它不是立即可用的。 您必須暫停直到可用。 AWS文檔的這一段很好地解釋了這一點:
CreateTable是一個異步操作。 收到CreateTable請求后,DynamoDB立即返回TableStatus為CREATING的響應。 創建表后,DynamoDB將TableStatus設置為ACTIVE。 您只能在ACTIVE表上執行讀取和寫入操作。 您可以使用DescribeTable API來檢查表狀態。
將調用添加到如所示的DescribeTable后,您應該會很好。
Geek Stocks的答案雖然不完整,但仍然很有幫助。 您可以處理CreateTable
操作的異步方面的一件事是使用Waiter :
$ddb_client->createTable(array('TableName' => 'my_table', ... ));
$ddb_client->waitUntil('TableExists', array('TableName' => 'my_table'));
但是 ,如何使用WriteRequestBatch
類也存在問題。 創建PutRequest
,必須傳入項目,而不是完整的PutItem
參數集。 WriteRequestBatch
是DynamoDB的BatchWriteItem
操作的抽象,該操作不允許使用Expected
參數。 如果要這樣做,則需要使用單獨的PutItem
/ UpdateItem
/ DeleteItem
請求。
這是正確使用WriteRequestBatch
的修改版本:
$putBatch = WriteRequestBatch::factory($ddb_client);
$putBatch->add(new PutRequest($item, 'my_table'));
// ADD MORE...
// ...
// ...
$putBatch->flush();
這是SDK用戶指南中使用WriteRequestBatch
另一個示例。
編輯 :我剛剛測試過的一個更完整的示例工作,它顯示了2.7.0之前和之后的版本之間的差異
use Aws\DynamoDb\DynamoDbClient;
use Aws\DynamoDb\Model\BatchRequest\WriteRequestBatch;
use Aws\DynamoDb\Model\BatchRequest\PutRequest;
use Aws\DynamoDb\Model\Item;
$client = DynamoDbClient::factory([/* ... */]);
$batch = WriteRequestBatch::factory($client);
for ($i = 1; $i <= 55; $i++) {
// FOR ANY SDK VERSION
// (NOTE: Does not support new M, L, BOOL, and NULL types)
$item = Item::fromArray(['id' => $i, 'data' => "foo{$i}"]);
// FOR SDK >= 2.7
$item = ['id' => ['N' => $i], 'data' => ['S' => "foo{$i}"]];
$batch->add(new PutRequest($item, 'my-table'));
}
$batch->flush();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.