Добавление списка не работает для AWS boto3 в DynamoDB

#python #amazon-web-services #aws-lambda #amazon-dynamodb

Вопрос:

Я пытаюсь добавить значение в запись таблицы DynamoDB:

 {
 "id": "1",
 "history": [
  "638380895-8"
 ],
 "currentbooks": "",
 "email": "ocomford0@craigslist.org",
 "name": "Osborne Comford"
}
 

Я пытаюсь написать код для добавления строковой записи в массив «история».

Ниже приведен мой код на python:

 usersTable = dynamodb.Table("users")
booksTable = dynamodb.Table("books")
bookisbn = event['isbn']
response = usersTable.update_item(
    Key={
        'id': userid,
    },
    UpdateExpression="set history=list_append(history, :s)",
    ExpressionAttributeValues={ 
        ':s': bookisbn

    },
    ReturnValues="UPDATED_NEW"
)
 

Это приводит меня к ошибке:

 "errorMessage": "An error occurred (ValidationException) when calling the UpdateItem operation: Invalid UpdateExpression: Incorrect operand type for operator or function; operator or function: list_append, operand type: S"
 

Ответ №1:

list_append работает с 2 списками:

 list_append(list1, list2)
 

Вам нужно передать выражение обновления вместе с типом добавляемого элемента, т. е. «L» для списка:

 response = usersTable.update_item(
    Key={
        'id': userid,
    },
    UpdateExpression="set history=list_append(history, :isbn)",
    ExpressionAttributeValues={ 
        ':isbn': {"L": [ { "S" : isbn } ]} # ensure you pass a list

    },
    ReturnValues="UPDATED_NEW"
)
 

См., например, документы.

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

1. Обновленный. Пробовать снова.

2. Все еще выдает мне ошибку: «ErrorMessage»: «Произошла ошибка (исключение проверки) при вызове операции updateItem: Недопустимое выражение обновления: Неверный тип операнда для оператора или функции; оператор или функция: list_append, тип операнда: M»,

3. Забыл о типе для isbn себя. Обновленный.

Ответ №2:

     response = usersTable.update_item(
    Key={
        'id': userid,
    },
    UpdateExpression="set history=list_append(history,:isbn)",
    ExpressionAttributeValues={ 
        ':isbn': [bookisbn]

    },
    ReturnValues="UPDATED_NEW"
)
 

Это правильное решение…