Вставить значение в таблицу DynamoDB с целочисленными атрибутами с помощью Boto

#python-3.x #amazon-dynamodb #boto3 #dynamodb-queries

#python-3.x #amazon-dynamodb #boto3 #dynamodb-запросы

Вопрос:

Я использую таблицу DynamoDB с именем DMS, в которой я регулярно обновляю некоторые значения. Для этого я сначала сохраняю все значения из элемента в переменной с именем «response». В моем примере элемент имеет первичный ключ 220. После этого я сохраняю значение атрибута (в моем случае элемента с заголовком 522) в переменной CounterOnePlus и добавляю 1. После этого я пытаюсь обновить данный атрибут элемента в столбце 522. Вот мой код:

 import boto3
dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('DMS')
AverageValue=220
DeltaValue=522
response = table.get_item(
    Key={
        'Average': '%d' % AverageValue,
    }
)
item = response['Item']
CounterOnePlus=int(item['%d' % DeltaValue]) 1
print(CounterOnePlus)
table.update_item(
        Key={
                'Average': '%d' % AverageValue,
        },
        UpdateExpression='SET 522 = :val1',
        ExpressionAttributeValues={
                ':val1': CounterOnePlus
        }
)
  

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу сохранить значения. Причиной этого является название заголовка, которое равно 522. Всякий раз, когда я вставляю значение в столбец со строковым заголовком типа «hallo», значение обновляется. Изменение значения 522 на строку с str(522) ничего не меняет.

Мое сообщение об ошибке выглядит следующим образом:

     2
    Traceback (most recent call last):
      File "TestBoto3.py", line 20, in <module>
        ':val1': CounterOnePlus
      File "/home/ubuntu/.local/lib/python3.6/site-packages/boto3/resources/factory.py", line 520, in do_action
        response = action(self, *args, **kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/boto3/resources/action.py", line 83, in __call__
        response = getattr(parent.meta.client, operation_name)(**params)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/client.py", line 357, in _api_call
        return self._make_api_call(operation_name, kwargs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/botocore/client.py", line 661, in _make_api_call
        raise error_class(parsed_response, operation_name)
    botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Syntax error; token: "522", near: "SET 522 ="
  

Есть идеи по моей проблеме? Спасибо

Ответ №1:

Используйте expressionattributenames (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions .ExpressionAttributeNames.html):

 table.update_item(
        Key={
                'Average': '%d' % AverageValue,
        },
        UpdateExpression='SET #DeltaValue = :val1',
        ExpressionAttributeValues={
                ':val1': CounterOnePlus
        },
        ExpressionAttributeNames= {
         "#DeltaValue": str(DeltaValue)  # 522
     }
)