Symfoware

Symfowareについての考察blog

DynamoDB データのインクリメント、デクリメント(アトミックカウンター)

UbuntuでDynamoDB Localを動かし、boto3で接続してみました。
DynamoDB LocalにPython(boto3)でテーブルの作成、データの登録

今回は、チュートリアルの「アトミックカウンター」を試してみます。
ステップ 3.4: アトミックカウンターを増分する


サンプルデータの登録



サンプルデータ登録用に、こんなプロクラムを作成して実行しておきました。


  1. # -*- coding:utf-8 -*-
  2. import boto3
  3. # 接続
  4. dynamodb = boto3.resource(
  5.     'dynamodb',
  6.     region_name='ap-northeast-1.',
  7.     endpoint_url="http://192.168.1.102:8000",
  8.     aws_access_key_id='ACCESS_ID',
  9.     aws_secret_access_key='ACCESS_KEY'
  10. )
  11. # テーブル作成
  12. table = dynamodb.create_table(
  13.     TableName='Sample',
  14.     KeySchema=[
  15.         {
  16.             'AttributeName': 'id',
  17.             'KeyType': 'HASH' #Partition key
  18.         },
  19.         {
  20.             'AttributeName': 'team',
  21.             'KeyType': 'RANGE' #Sort key
  22.         }
  23.     ],
  24.     AttributeDefinitions=[
  25.         {
  26.             'AttributeName': 'id',
  27.             'AttributeType': 'N'
  28.         },
  29.         {
  30.             'AttributeName': 'team',
  31.             'AttributeType': 'S'
  32.         },
  33.     ],
  34.     ProvisionedThroughput={
  35.         'ReadCapacityUnits': 10,
  36.         'WriteCapacityUnits': 10
  37.     }
  38. )
  39. print("Table status:", table.table_status)
  40. # データ登録
  41. table.put_item(
  42.     Item={
  43.         'id': 1,
  44.         'team': 'あんこう',
  45.         'members': ['西住 みほ', '武部 沙織', '五十鈴 華', '秋山 優花里', '冷泉 麻子'],
  46.         'defeat_count' : 0
  47.     }
  48. )
  49. table.put_item(
  50.     Item={
  51.         'id': 2,
  52.         'team': 'カメ',
  53.         'members': ['角谷 杏', '小山 柚子', '河嶋 桃'],
  54.         'defeat_count' : 0
  55.     }
  56. )
  57. table.put_item(
  58.     Item={
  59.         'id': 3,
  60.         'team': 'アヒル',
  61.         'members': ['磯辺 典子', '近藤 妙子', '河西 忍', '佐々木 あけび'],
  62.         'defeat_count' : 0
  63.     }
  64. )
  65. table.put_item(
  66.     Item={
  67.         'id': 4,
  68.         'team': 'カバ',
  69.         'members': ['カエサル', 'エルヴィン', '左衛門佐', 'おりょう'],
  70.         'defeat_count' : 0
  71.     }
  72. )





アトミックカウンター



id:1のdefeat_countを増加させてみます。


  1. # -*- coding:utf-8 -*-
  2. import boto3
  3. # 接続
  4. dynamodb = boto3.resource(
  5.     'dynamodb',
  6.     region_name='ap-northeast-1.',
  7.     endpoint_url="http://192.168.1.102:8000",
  8.     aws_access_key_id='ACCESS_ID',
  9.     aws_secret_access_key='ACCESS_KEY'
  10. )
  11. # テーブル取得
  12. table = dynamodb.Table('Sample')
  13. # defeat_countをインクリメント
  14. response = table.update_item(
  15.     Key={
  16.         'id': 1,
  17.         'team': 'あんこう'
  18.     },
  19.     UpdateExpression='set defeat_count = defeat_count + :val',
  20.     ExpressionAttributeValues={
  21.         ':val': 1
  22.     },
  23.     ReturnValues='UPDATED_NEW'
  24. )
  25. print('UpdateItem succeeded:')
  26. print(response)




実行結果


$ python3 sample.py
UpdateItem succeeded:
{'Attributes': {
    'defeat_count': Decimal('1')
},
'ResponseMetadata': {
    'RequestId': '2a2f4d43-71be-42d4-a2b4-61d9df46d1a8',
    'HTTPStatusCode': 200,
    'HTTPHeaders': {
        'content-type': 'application/x-amz-json-1.0',
        'x-amz-crc32': '2351066368',
        'x-amzn-requestid': '2a2f4d43-71be-42d4-a2b4-61d9df46d1a8',
        'content-length': '41',
        'server': 'Jetty(8.1.12.v20130726)'
},
'RetryAttempts': 0}
}



もう一度実行すると、

'defeat_count': Decimal('2')


となります。


同じ要領で、今度は数字を減らしてみます。


  1. # -*- coding:utf-8 -*-
  2. import boto3
  3. # 接続
  4. dynamodb = boto3.resource(
  5.     'dynamodb',
  6.     region_name='ap-northeast-1.',
  7.     endpoint_url="http://192.168.1.102:8000",
  8.     aws_access_key_id='ACCESS_ID',
  9.     aws_secret_access_key='ACCESS_KEY'
  10. )
  11. # テーブル取得
  12. table = dynamodb.Table('Sample')
  13. # defeat_countをインクリメント
  14. response = table.update_item(
  15.     Key={
  16.         'id': 1,
  17.         'team': 'あんこう'
  18.     },
  19.     UpdateExpression='set defeat_count = defeat_count - :val',
  20.     ExpressionAttributeValues={
  21.         ':val': 1
  22.     },
  23.     ReturnValues='UPDATED_NEW'
  24. )
  25. print('UpdateItem succeeded:')
  26. print(response)



実行すると、defeat_countが1つ減っているのが確認できました。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2018/06/25(月) 22:31:18|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<DynamoDB 条件付きでデータを更新する | ホーム | DynamoDB LocalにPython(boto3)でテーブルの作成、データの登録>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/2209-f893d2e7
この記事にトラックバックする(FC2ブログユーザー)