2012年2月15日水曜日

SimpleDBのドメイン内のデータを一覧表示(NextTokenに注意)

スズキです。

SimpleDBはRDBのSELECTのようなクエリーが発行でき、
条件に該当するデータを取得することができます。

しかし、一回のAPIリクエストで取得できるデータ数は100件までで、
それ以降を取得するには、「NextToken」というものを利用して、
再度同様のクエリーをAPIでリクエストする必要があります。

具体的には、100件以上該当データがある場合、レスポンスにNextTokenが含まれ、
そのNextTokenを指定して、再度同様のクエリーをリクエストする形になります。
当然、次の100件でもデータが取りきれない場合は、レスポンスに同様に
NextTokenが含まれるので、それを用いて再度リクエストすることになります。

上記を考慮すると、すべてのデータを取得するには、NextTokenがあるかぎり、
複数のリクエストを行う必要があります。

ということで、PHPで簡単に作ってみました。

<?php
require_once(AWS_SDK_PATH . "/sdk.class.php");
date_default_timezone_set("Asia/Tokyo");

$sdb = new AmazonSDB(
    array("key" => SDB_KEY_ACCESS, "secret" => SDB_KEY_SECRET)
);
$sdb->set_region(AmazonSDB::REGION_APAC_NE1);

$query = "SELECT * FROM log WHERE uid >= '0' ORDER BY uid DESC";
$option = array();
do {
    $response = $sdb->select($query, $option);
    foreach($response->body->SelectResult->Item as $item) {
        print($item->Name . "\t");
        foreach($item->Attribute as $attribute) {
            print($attribute->Name  . ":");
            print($attribute->Value . "\t");
        }
        print("\n");
    }
    if(isset($response->body->SelectResult->NextToken)) {
        $option["NextToken"] = $response->body->SelectResult->NextToken;
    } else {
        $option["NextToken"] = null;
    }
} while($option["NextToken"] != null);

exit(0);
?>

実行すると下記のようになります。

# php list-data.php
4f3b67cf5396d8.04566676 uid:1 timestamp:1329293263 action:1 
4f3b65774e50c6.59284865 uid:1 timestamp:1329292663 action:1 
4f3b64ab8239a8.32909808 uid:1 timestamp:1329292459 action:1 
4f3b649b3a3cd1.62613728 uid:1 timestamp:1329292443 action:1 
4f3b625e9e17f1.40124430 uid:1 timestamp:1329291870 action:1 
4f3b58032f0737.20329909 uid:1 timestamp:1329289219 action:1
...

これ応用すれば、SipmleDBのバックアップも簡単に作れるかも。
--------
http://www.suz-lab.com

0 コメント: