ドキュメント に続いて、dynamodbテーブルに属性が1つしか存在しない場合に更新または追加する更新ステートメントを作成しようとしています。
私はこれを試しています
_response = table.update_item(
Key={'ReleaseNumber': '1.0.179'},
UpdateExpression='SET',
ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')',
ExpressionAttributeNames={'attr1': 'val1'},
ExpressionAttributeValues={'val1': 'false'}
)
_
私が得ているエラーは次のとおりです:
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: ExpressionAttributeNames contains invalid key: Syntax error; key: "attr1"
誰かが私が達成しようとしていることと似たようなことをした場合は、例を共有してください。
作業例 here が見つかりました。テーブルのすべてのインデックスをキーとしてリストすることが非常に重要です。これには、更新前に追加のクエリが必要ですが、動作します。
response = table.update_item(
Key={
'ReleaseNumber': releaseNumber,
'Timestamp': result[0]['Timestamp']
},
UpdateExpression="set Sanity = :r",
ExpressionAttributeValues={
':r': 'false',
},
ReturnValues="UPDATED_NEW"
)
boto3
を使用したdynamodb更新の詳細は、オンラインでは非常にまばらに見えるため、これらの代替ソリューションが役立つことを期待しています。
import boto3
table = boto3.resource('dynamodb').Table('my_table')
# get item
response = table.get_item(Key={'pkey': 'asdf12345'})
item = response['Item']
# update
item['status'] = 'complete'
# put (idempotent)
table.put_item(Item=item)
import boto3
table = boto3.resource('dynamodb').Table('my_table')
table.update_item(
Key={'pkey': 'asdf12345'},
AttributeUpdates={
'status': 'complete',
},
)
元のコード例:
response = table.update_item(
Key={'ReleaseNumber': '1.0.179'},
UpdateExpression='SET',
ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')',
ExpressionAttributeNames={'attr1': 'val1'},
ExpressionAttributeValues={'val1': 'false'}
)
一定:
response = table.update_item(
Key={'ReleaseNumber': '1.0.179'},
UpdateExpression='SET #attr1 = :val1',
ConditionExpression=Attr('ReleaseNumber').eq('1.0.179'),
ExpressionAttributeNames={'#attr1': 'val1'},
ExpressionAttributeValues={':val1': 'false'}
)
マークされた回答では、Key
にも含める必要がある範囲キーがあることも明らかになりました。 update_itemメソッドは、更新する正確なレコードをシークする必要があり、バッチ更新はありません。また、単一のレコードを取得する条件にフィルター処理された値の範囲を更新することはできません。 ConditionExpression
は、更新をべき等にするのに役立ちます。つまり、値が既にその値である場合は値を更新しないでください。 sql where
句とは異なります。
見られる特定のエラーに関して。
ExpressionAttributeNames
は、UpdateExpressionで使用するキープレースホルダーのリストで、キーが予約語の場合に役立ちます。
ドキュメントから、「式の属性名は#で始まり、その後に1つ以上の英数字が続く必要があります」。エラーは、コードが#
で始まるExpressionAttributeNameを使用しておらず、UpdateExpression
でも使用されていないためです。
ExpressionAttributeValues
は、更新する値のプレースホルダーであり、:
で始まる必要があります