web-dev-qa-db-ja.com

dynamodb boto3のupdate_itemの例

ドキュメント に続いて、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"

誰かが私が達成しようとしていることと似たようなことをした場合は、例を共有してください。

25
Dmitry R

作業例 here が見つかりました。テーブルのすべてのインデックスをキーとしてリストすることが非常に重要です。これには、更新前に追加のクエリが必要ですが、動作します。

response = table.update_item(
    Key={
        'ReleaseNumber': releaseNumber,
        'Timestamp': result[0]['Timestamp']
    },
    UpdateExpression="set Sanity = :r",
    ExpressionAttributeValues={
        ':r': 'false',
    },
    ReturnValues="UPDATED_NEW"
)
34
Dmitry R

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',
    },
)
11
Ryan Tuck

元のコード例:

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は、更新する値のプレースホルダーであり、:で始まる必要があります

8
Davos