LoginSignup
13
10

More than 5 years have passed since last update.

DynamoDBでSEQUENCE

Last updated at Posted at 2014-03-31

目的

以前S3でシーケンスを行うみたいな記事を書いて
(S3上でSEQUENCE)[http://qiita.com/supertaihei02/items/16b9d1cd938fb074e01e]
会員情報とかS3で管理してランニングコストを下げたいんだー!とか抜かしましたけれども、
これ無理でした。詳細は元記事に追記してます。
代案としてこちらの方法を発見したわけであります。
そうなってくるとランニングコスト下がるかなー?って突っ込みは受け付けません。

とにかく具体的な情報が少なかった。。意外とマイナー?
ずばっとソースを書きます。これでできました! 2014/03/31現在!

下準備

AWSにアクセスしてーDynamoDBを有効化してーもろもろの部分はちょっと他で調べてたも。
準備ができたらまずはクライアント取るところまで。


require(dirname(__FILE__).'/aws.phar'); // load aws.phar
use Aws\Common\Aws;
use Aws\Common\Enum\Region;

$accesskey = 'Your AWS Access Key'; // TODO
$secret = 'Your AWS Access Secret'; // TODO
$region = 'Your Region'; // TODO (Tokyo => Region::AP_NORTHEAST_1)

$aws = AWS::factory(array(
    'key' => $accesskey,
    'secret' => $secret,
    'certificate_authority' => false,
    'region' => $region
));
$client = $aws->get('dynamodb');

シーケンス

これは正式(?)にはatomic counterと呼ばれている手法の様です。
DynamoDBテーブルレコード上のTypeが"Number"のAttributeに対してのみ実行できるアップデートコマンドと考えるとしっくりきます。

以下ソースです。Your ~の部分は自分パラメータに置換してくださいね。

$num = 1;
try {
    $item = $client->updateItem(array(
        'TableName' => 'Your Tablename',
        'Key' => array(
            'Your object keyname' => array(
                'Your object keytype' => 'Your object keyvalue'
            )
        ),
        'AttributeUpdates' => array(
            'Your update object keyname' => array(
                'Action' => 'ADD',
                'Value' => array('N' => $num)
            )
        ),
        'Expected' => null,
        'ReturnValues' => 'UPDATED_NEW'
    ));

    echo intval($item['Attributes']['memberSequence']['N'], 10);
} catch(Exception $e) {
    echo $e->getMessage();
}

指定したAttributeが$num値ずつインクリメントされます。
ReturnValuesにUPDATED_NEWを指定しているので更新された後の番号が$itemに入ってきます。
他に(NONE | ALL_OLD | UPDATED_OLD | ALL_NEW)が指定可能です。
Action => ADDのとこがポイントですねー。
Expectedの部分を指定すると条件付きアップデートってのもできそう。

以上!

13
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
10