В этом модуле вы научитесь использовать API UpdateItem для обновления атрибутов существующего элемента в нашей базе данных. В этом модуле вы научитесь использовать API UpdateItem для обновления атрибутов существующего элемента в нашей базе данных.

Время, необходимое для прохождения модуля: 15 минут


Помимо записи и чтения данных вам потребуется периодически обновлять имеющиеся данные в базе данных. Лучше всего, если у вас будет возможность обновлять эти данные одним вызовом и вам не придется сначала считывать элемент, а затем записывать весь элемент с обновлениями. В DynamoDB можно обновлять элементы на месте с помощью вызова API UpdateItem.

В этом примере у каждого элемента есть атрибут Formats, который представляет собой перечень всех форматов, имеющихся в вашем книжном магазине для определенной книги. Со временем этот перечень необходимо обновлять для определенных книг из-за добавления новых форматов или прекращения поддержки тех или иных форматов.


  • Обновление элемента

    При обновлении элемента в коде вашего приложения основное внимание уделите указанным ниже четырем элементам.

    • Ключ, используемый для идентификации элемента, который вы хотите обновить.
    • Имена атрибутов выражения, которые представляют собой заполнители для атрибутов, которые вы хотите обновить.
    • Значения атрибутов выражения, которые представляют собой заполнители для значений, с помощью которых вы хотите обновить атрибуты.
    • Выражение обновления, в котором используются имена и значения атрибутов выражения для объявления необходимых вам обновлений.

    Представьте, что вы недавно добавили формат аудиокниги для книги Джона Гришэма (John Grisham) Золотой дождь (The Rainmaker) и хотите обновить таблицу DynamoDB, чтобы внести в нее соответствующие изменения. Вызов API UpdateItem будет выглядеть следующим образом.

    # The UpdateItem API allows you to update a particular item as identified by its key.
    resp = table.update_item(
        Key={"Author": "John Grisham", "Title": "The Rainmaker"},
        # Expression attribute names specify placeholders for attribute names to use in your update expressions.
        ExpressionAttributeNames={
            "#formats": "Formats",
            "#audiobook": "Audiobook",
        },
        # Expression attribute values specify placeholders for attribute values to use in your update expressions.
        ExpressionAttributeValues={
            ":id": "8WE3KPTP",
        },
        # UpdateExpression declares the updates you want to perform on your item.
        # For more details about update expressions, see https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.UpdateExpressions.html
        UpdateExpression="SET #formats.#audiobook = :id",
    )

    В вашем вызове API UpdateItem имеются все четыре элемента. Во-первых, в нем указан ключ элемента, над которым необходимо выполнить действия, в котором предоставлены сведения об авторе (Author) John Grisham (Джон Гришэм) и названии (Title) The Rainmaker (Золотой дождь) книги.

    Во-вторых, вы указали имена атрибутов выражения, которые вы будете использовать в выражении обновления. Вы изменяете атрибут Formats, который представляет собой перечень, поэтому вам необходимо определить имена атрибутов выражения как для атрибута (Formats), так и для ключа в перечне (Audiobook).

    И, наконец, вы записываете выражение обновления, которое вы хотите применить в своем вызове API UpdateItem. Как было сказано выше, в этом выражении обновления используются как имена, так и значения атрибутов выражения. Выражение SET #formats.#audiobook = :id сообщает DynamoDB, что для ключа Audiobook атрибута Formats необходимо задать определенное значение идентификатора, равное 8WE3KPTP

    В-третьих, вы задаете значение, которое хотите использовать в значениях атрибута выражения. В перечне Formats значение для формата представляет собой номер элемента в вашей системе учета. В данном примере это значение равно 8WE3KPTP.

    Скрипт update_item.py совершает вызов API UpdateItem, показанный в блоке кода ранее в этом модуле. Чтобы продемонстрировать, что делает вызов, перед совершением вызова на обновление скрипт сначала извлекает и печатает элемент. Затем он совершает вызов API UpdateItem. И, наконец, скрипт во второй раз извлекает и печатает элемент, чтобы показать, какие изменения были внесены.

    Это действие можно посмотреть, выполнив указанную ниже команду.

    $ python update_item.py

    В результате должны отобразиться указанные ниже выходные данные.

    Item before update:
    {'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}
    Item after update:
    {'Title': 'The Rainmaker', 'Formats': {'Audiobook': '8WE3KPTP', 'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    Как вы видите, после применения обновления для книги The Rainmaker (Золотой дождь) появился новый формат Audiobook (Аудиокнига).


    В этом модуле вы узнали, как обновить существующий элемент с помощью API UpdateItem. В следующем модуле вы научитесь удалять созданные вами ресурсы, чтобы избежать дополнительных расходов.