Symfoware

Symfowareについての考察blog

DynamoDB 条件付きでデータを更新する

DynamoDBの機能を試しています。
DynamoDB LocalにPython(boto3)でテーブルの作成、データの登録
DynamoDB データのインクリメント、デクリメント(アトミックカウンター)

今回は、SQLで言うところのwhere句を指定してのデータ更新を試してみます。


ステップ 3.5: 項目を更新する (条件付き)



こちらを参考にしています。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.03.html

データは、前回作成したものをそのまま流用しました。
DynamoDB データのインクリメント、デクリメント(アトミックカウンター)

サンプルを見様見真似で、メンバーが3名より多い場合、データのの「defeat_count」を
10で更新してみます。

キーを指定せず更新できると思っていたのですが、Keyは必須のようで思い通りの操作になりませんでした。
(本当は全件更新したかった)


  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. # データ更新
  14. response = table.update_item(
  15.     Key={
  16.         'id':1,
  17.         'team': 'あんこう',
  18.     },
  19.     UpdateExpression='set defeat_count = :defeat_count',
  20.     ConditionExpression="size(members) > :num",
  21.     ExpressionAttributeValues={
  22.         ':defeat_count': 10,
  23.         ':num': 3
  24.     },
  25.     ReturnValues='UPDATED_NEW'
  26. )
  27. print(response)





リスト項目の削除



setでデータを更新しましたが、removeでリストの項目の削除が行なえます。
更新の式には、他にもaddやdeleteがあります。
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html

membersの最初の項目を削除してみます。


  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. # データ更新
  14. response = table.update_item(
  15.     Key={
  16.         'id':1,
  17.         'team': 'あんこう',
  18.     },
  19.     UpdateExpression='remove members[0]',
  20.     ConditionExpression="size(members) > :num",
  21.     ExpressionAttributeValues={
  22.         ':num': 3
  23.     },
  24.     ReturnValues='UPDATED_NEW'
  25. )
  26. print(response)




最初の実行


$ python3 sample.py
{'Attributes': {'members': ['武部 沙織', '五十鈴 華', '秋山 優花里', '冷泉 麻子']},



2回目の実行


$ python3 sample.py
{'Attributes': {'members': ['五十鈴 華', '秋山 優花里', '冷泉 麻子']},



もう一度実行すると、条件に合致するデータがないのでエラーになります。


$ python3 sample.py
botocore.errorfactory.ConditionalCheckFailedException:
An error occurred (ConditionalCheckFailedException) when calling the UpdateItem operation: The conditional request failed






リスト項目の追加



削除したメンバーを戻しておきます。
リストに項目を追加するには「list_append」を使用します。


  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. # データ更新
  14. response = table.update_item(
  15.     Key={
  16.         'id':1,
  17.         'team': 'あんこう',
  18.     },
  19.     UpdateExpression='set members = list_append(members, :append_members)',
  20.     ExpressionAttributeValues={
  21.         ':append_members': ['西住 みほ', '武部 沙織']
  22.     },
  23.     ReturnValues='UPDATED_NEW'
  24. )
  25. print(response)




実行結果


$ python3 sample.py
{'Attributes': {'members': ['五十鈴 華', '秋山 優花里', '冷泉 麻子', '西住 みほ', '武部 沙織']},



関連記事

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

  1. 2018/06/25(月) 23:02:13|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Redis リストデータの操作について(rpush, lrange, ltrim) | ホーム | DynamoDB データのインクリメント、デクリメント(アトミックカウンター)>>

コメント

コメントの投稿


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

トラックバック

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