1. ホーム
  2. python

[解決済み] AWS DynamoDBでリスト属性に値を追加するには?

2022-02-19 11:12:59

質問

DynamoDBをK-Vデータベースとして使っているのですが(データが少ないので大丈夫だと思います)、「V」の一部がリスト型になっています(10要素程度)。そこに新しい値を追加するセッションがありますが、私は1つのリクエストでこれを行う方法を見つけることができません。私がやったことは次のようなものです。

item = self.list_table.get_item(**{'k': 'some_key'})
item['v'].append('some_value')
item.partial_save()

先にサーバーにリクエストし、値を変更した後に保存しています。これはアトミックではなく、見た目も悪いです。これを1回のリクエストで行う方法はないでしょうか?

解決方法は?

以下のコードでboto3が動作するはずです。

table = get_dynamodb_resource().Table("table_name")
result = table.update_item(
    Key={
        'hash_key': hash_key,
        'range_key': range_key
    },
    UpdateExpression="SET some_attr = list_append(some_attr, :i)",
    ExpressionAttributeValues={
        ':i': [some_value],
    },
    ReturnValues="UPDATED_NEW"
)
if result['ResponseMetadata']['HTTPStatusCode'] == 200 and 'Attributes' in result:
    return result['Attributes']['some_attr']

ここでのget_dynamodb_resourceメソッドは、ただ。

def get_dynamodb_resource():
    return boto3.resource(
            'dynamodb',
            region_name=os.environ['AWS_DYNAMO_REGION'],
            endpoint_url=os.environ['AWS_DYNAMO_ENDPOINT'],
            aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'],
            aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID'])