#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:
Выражения обновления и пример см. В документе boto3
.
UpdateExpression
Вероятно, ваш должен быть (без одинарных кавычек):
UpdateExpression="SET last_seen = :s",
Комментарии:
1. Спасибо. Это сработало. Есть небольшая проблема. Поле first_seen не добавляется в таблицу с помощью приведенного выше кода. Что мне следует сделать, чтобы убедиться, что все остальные поля распространяются так, как они есть, и просто обновите значение «last_seen».
2. Нет, это должно работать просто отлично;
table.update_item()
атрибуты останутся неуказанными как часть обновления без изменений. Вы создали элемент со всеми атрибутами в первую очередь? Например,update_item()
на несуществующем ключе будет создан элемент (с пустымfirst_seen
).3. Я предполагаю, что update_item должен создать все, что сделал бы put_item, если элемент еще не существует. Если он существует, просто обновите last_seen time. Это мой вариант использования. Можете ли вы помочь мне с изменениями в коде, которые могут этого достичь.