DynamoDB update_item: увеличить значения для существующих элементов или использовать 1 для нового элемента - PullRequest
0 голосов
/ 23 февраля 2020

Я пытаюсь использовать элемент обновления, так как в соответствии с вики он работает для обновления существующих и создания новых элементов:

"Редактирует атрибуты существующего элемента или добавляет новый элемент в таблицу, если он это делает еще не существует. "

Я хочу сохранить:

  • при первом открытии элемента
  • при последнем открытии элемента
  • количество открытий элемента

У меня следующий код:

table.update_item(
                Key={'item':"NEW"},
                UpdateExpression="SET opens = if_not_exists(opens + :var1, :var0), last_open = :var2, first_open = if_not_exists(first_open, :var3)",
                ExpressionAttributeValues={
                ':var0': "0",
                ':var1': "1",
                ':var2': '2020-04-01',
                ':var3': '1999-01-01'
                },
        ReturnValues="UPDATED_NEW"
                )

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

Произошла ошибка (ValidationException) при вызове операции UpdateItem: Неверное выражение UpdateExpression: синтаксическая ошибка; токен: \ "+ \", рядом: \ "открывает +: var1 \" "

Следующие работы для существующих элементов, но выдает ошибку для новых:

table.update_item(
            Key={'item':"NEW"},
            UpdateExpression="SET opens = opens + :var1, last_open = :var2, first_reachout = if_not_exists(first_open, :var3)",
            ExpressionAttributeValues={
            ':var1': "1",
            ':var2': '2020-04-01',
            ':var3': '1999-01-01'
            },
    ReturnValues="UPDATED_NEW"
            )

Ошибка только для новых:

"Произошла ошибка (ValidationException) при вызове операции UpdateItem: предоставленное выражение ссылается на атрибут, который не существует в элементе"

Полагаю, это означает атрибут контактов, но включение его в "if_not_exists" также не работает ....

1 Ответ

0 голосов
/ 23 февраля 2020

Документацию по синтаксису UpdateExpression можно найти в https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html#Expressions .UpdateExpressions.SET . Соответствующая часть вашего вопроса следующая:

value ::=
    operand
    | operand '+' operand
    | operand '-' operand

operand ::=
    path | function

Это означает, что «+» может быть только на верхнем уровне выражения, но не может быть внутри параметров функции.

К счастью, для вас есть простой обходной путь. Вместо if_not_exists(opens + :var1, :var0), который вы пробовали, попробуйте ":var1 + if_not_exists(opens, :var0).

...