前回の記事から引き続き、Amazon DynamoDBに奮闘中です。
どうにかこうにかテーブルをつくって、putItemやgetItemは無難にできるようになったのですが、ハッシュキーと、レンジキーを指定しての「query」で、Fatalエラーが大量に返ってくる。
公式Webサイトのドキュメントには、以下のサンプルコードが載っているのですが、そのまま書いてもダメ。
http://docs.aws.amazon.com/AWSSDKforPHP/latest/#m=AmazonDynamoDB/query
[php]
$response = $dynamodb->query(array(
‘TableName’ => $table_name,
‘HashKeyValue’ => array(
AmazonDynamoDB::TYPE_NUMBER => ‘1’
),
‘RangeKeyCondition’ => array(
‘ComparisonOperator’ => AmazonDynamoDB::CONDITION_GREATER_THAN_OR_EQUAL,
‘AttributeValueList’ => array(
array(AmazonDynamoDB::TYPE_NUMBER => ‘0’)
),
)
)
);
[/php]
・・・ん? と、よく見たら、ページタイトルが「AWS SDK for PHP 1.6.2」とある。
そういえば、インストールしたのは、カレントバージョンの「AWS SDK for PHP 2」だったような・・・
で、改めて最新のドキュメントの、
http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html
を見返してみると、「Request Syntax」の仕様が微妙に変わっている・・・
なんだってー(笑)。
で、結局のところ、上記のサンプルコードを for PHP 2 で書き換えると、以下のようになりました。
[php]
$response = $dynamodb->query(array(
‘TableName’ => $table_name,
‘KeyConditions’ => array(
$hash_key_name => array(
‘AttributeValueList’ => array(
array(‘N’ => ‘1’)
),
‘ComparisonOperator’ => ‘EQ’
),
$range_key_name => array(
‘AttributeValueList’ => array(
array(‘N’ => ‘0’)
),
‘ComparisonOperator’ => "GE"
)
)
)
);
//ついでにそのレスポンスからjson形式にして返す
if (intval($response[‘Count’]) > 0){
foreach ($response[‘Items’] as $item){
$array_return[] = array(
$hash_key_name => $item[$hash_key_name][‘N’],
$range_key_name => $item[$range_key_name][‘N’],
//他に値があれば連想配列につっこむ
//’val00′ => $item[‘val00’][‘S’],
//’val01′ => $item[‘val01’][‘N’],
);
}
echo json_encode($array_return);
}
else{
echo ""; //該当のデータがない
}
[/php]
“$hash_key_name” には、ハッシュキーにしたカラム名をstringで指定し、“$range_key_name”には、レンジキーとして指定したカラム名を同様にstringで記述します。
こういう仕様になったのは、セカンダリインデックスなどの仕様が追加されたからでしょうか。
そういえば、Amazon DynamoDBのトップページは、「(ベータ版)」と明記されていました。そうなのか(笑)。だからこういう大変更もあるのですね。。。それにしてもベータ版にお金が発生するとか・・・
Web上にもあまりサンプルコードがなかったので、シェアする意味も含め、ここにメモしておきます。
このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。
日々の開発作業で気づいたこと共有を。同じところで躓いている人が、 検索で辿り着けたら良いな、というスタンスで記事を書くので不定期更新になります。
コメントする