Обновление записей JSON в таблице DynamoDB с помощью Python

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

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

Вопрос:

У меня есть запись JSON, которая выглядит так:

  {'ip_address': data['src_ip'],
  'first_seen': data['timestamp'],
  'last_seen': data['timestamp']
                        }
 

Запись сохраняется в таблице DynamoDB в ip_address качестве первичного ключа.

Когда тот же IP-адрес появится снова, я хочу обновить последнее увиденное значение. Я создал функцию со строками ниже:

 def update_db(json_result):
    ddb_data = json.loads(json.dumps(json_result), parse_float=Decimal)
    database = boto3.resource('dynamodb', endpoint_url="https://dynamodb.us-west-2.amazonaws.com")
    table = database.Table('IPData')
    print("adding :", json_result)
    #db_add = table.put_item(Item = ddb_data)
    response = table.update_item(
                        Key = {
                            'ip_address': json_result['ip_address'] 
                        },
                        UpdateExpression="SET 'last_seen' = :s",
                        ExpressionAttributeValues = {
                                        ':s': json_result['last_seen']
                        },
                        ReturnValues="UPDATED_NEW"
                    )
    return response
 

Это приводит к ошибке, поскольку:

 {
  "errorMessage": "An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Syntax error; token: "'", near: "SET 'last_seen"",
  "errorType": "ClientError",
 

Не уверен, что здесь не так в моем синтаксисе. Может кто-нибудь помочь мне решить проблему.

Ответ №1:

Комментарии:

1. Спасибо. Это сработало. Есть небольшая проблема. Поле first_seen не добавляется в таблицу с помощью приведенного выше кода. Что мне следует сделать, чтобы убедиться, что все остальные поля распространяются так, как они есть, и просто обновите значение «last_seen».

2. Нет, это должно работать просто отлично; table.update_item() атрибуты останутся неуказанными как часть обновления без изменений. Вы создали элемент со всеми атрибутами в первую очередь? Например, update_item() на несуществующем ключе будет создан элемент (с пустым first_seen ).

3. Я предполагаю, что update_item должен создать все, что сделал бы put_item, если элемент еще не существует. Если он существует, просто обновите last_seen time. Это мой вариант использования. Можете ли вы помочь мне с изменениями в коде, которые могут этого достичь.