В этом уроке мы по шагам рассмотрим несколько простых примеров вставки и получения данных в DynamoDB. Вы создадите собственную таблицу DynamoDB с помощью API CreateTable,а затем вставите в нее несколько элементов с помощью вызова API BatchWriteItem. И, наконец, вы выполните извлечение элементов с помощью вызова API GetItem. Прежде чем вы приступите к работе с этими примерами, мы обсудим модель данных, которую необходимо использовать в вашем приложении книжного онлайн-магазина.

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

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


В данном модуле ключевую роль играют указанные ниже понятия DynamoDB.

  • Таблица. Это коллекция записей данных DynamoDB.
  • Элемент. Одна запись данных в таблице DynamoDB. Это понятие сравнимо со строкой в реляционной базе данных.
  • Атрибут. Один элемент данных в элементе. Это понятие сравнимо со столбцом в реляционной базе данных. Тем не менее в отличие от столбцов в реляционной базе данных при создании таблицы не нужно указывать атрибуты, отличные от первичного ключа, который мы обсудим далее в этом модуле. Атрибуты могут иметь как простой (например, строка, целое или логическое значение), так и сложный тип (например, список или сопоставление).
  • Первичный ключ. Первичный ключ – это уникальный идентификатор для одного элемента в таблице DynamoDB. Имя и тип первичного ключа необходимо указывать при создании таблицы. Более того, первичный ключ указанного типа необходимо включать в каждый элемент, записываемый в таблицу. Простой первичный ключ состоит из одного атрибута, а составной первичный ключ – из двух: ключа секции и ключа сортировки. Например, вы можете создать простой первичный ключ, используя код пользователя UserID в качестве идентификатора, либо создать составной первичный ключ, объединив код пользователя UserID и дату создания Creation_Date в идентификаторе элемента.

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

DynamoDB – это нереляционная база данных. При использовании нереляционных баз данных не нужно заранее указывать полную схему при создании таблицы. Достаточно только объявить первичный ключ для таблицы, который будет использоваться для уникальной идентификации каждой записи в таблице. Это позволяет уменьшить предварительные издержки на разработку модели данных, так как вы можете с легкостью изменять схему по мере изменения потребностей приложения.

Как было упомянуто в разделе «Базовые материалы для создания приложения» главы «Введение» данного руководства, вашему приложению необходимо получать сведения об отдельной книге по ее названию и автору. Так как сочетание названия и автора представляет собой уникальный идентификатор книги, вы можете использовать эти атрибуты в качестве первичного ключа для своей таблицы. Вашему приложению также необходимо хранить информацию о категории книги (например, «История» или «Биографии») и сведения о доступных форматах книги (твердый или мягкий переплет либо аудиокнига), которые сопоставлены с номерами элементов в вашей системе учета.

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

  • Title (строка): название книги
  • Author (строка): автор книги
  • Category (строка): категория книги, например «История», «Биографии» или «Научная фантастика»
  • Formats (перечень): различные доступные форматы продаваемых книг (твердый или мягкий переплет либо аудиокнига) и их номера в вашей системе учета

Выполнив описанные ниже действия, вы создадите таблицу, указав для нее составной первичный ключ (Author и Title). Затем вы загрузите несколько элементов в свою таблицу и получите отдельные элементы из нее.


  • Шаг 1. Создание таблицы Amazon DynamoDB

    В загруженном вами каталоге имеется скрипт create_table.py, который создает таблицу Books с использованием API CreateTable. Вы можете запустить этот скрипт, введя указанную ниже команду в терминале AWS Cloud9.

    $ python create_table.py

    Если вы откроете скрипт create_table.py в редакторе AWS Cloud9, вы увидите указанное ниже.

    • Скрипт указывает составной первичный ключ вашей таблицы в аргументе KeySchema вызова API CreateTable. В вашей таблице атрибут Author используется в качестве ключа хэша, а атрибут Title – в качестве ключа диапазона.
    • Скрипт указывает выделенную пропускную способность для вашей таблицы, определяя единицы ресурсов как для чтения, так и для записи. В DynamoDB вы можете настроить ресурсы чтения и записи раздельно. Это позволяет точно настроить конфигурацию, чтобы удовлетворить потребности приложения, не платя за избыточное выделение ресурсов.
  • Шаг 2. Загрузка элементов в таблицу

    На этом шаге вы загрузите несколько книг в таблицу. В терминале AWS Cloud9 выполните указанную ниже команду.
    $ python insert_items.py
    Эта команда запускает указанный ниже скрипт.
    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    with table.batch_writer() as batch:
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Rainmaker",
            "Category": "Suspense", "Formats": { "Hardcover": "J4SUKVGU", "Paperback": "D7YF4FCX" } })
        batch.put_item(Item={"Author": "John Grisham", "Title": "The Firm",
            "Category": "Suspense", "Formats": { "Hardcover": "Q7QWE3U2",
            "Paperback": "ZVZAYY4F", "Audiobook": "DJ9KS9NM" } })
        batch.put_item(Item={"Author": "James Patterson", "Title": "Along Came a Spider",
            "Category": "Suspense", "Formats": { "Hardcover": "C9NR6RJ7",
            "Paperback": "37JVGDZG", "Audiobook": "6348WX3U" } })
        batch.put_item(Item={"Author": "Dr. Seuss", "Title": "Green Eggs and Ham",
            "Category": "Children", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
        batch.put_item(Item={"Author": "William Shakespeare", "Title": "Hamlet",
            "Category": "Drama", "Formats": { "Hardcover": "GVJZQ7JK",
            "Paperback": "A4TFUR98", "Audiobook": "XWMGHW96" } })
    

    Как видно из показанного выше скрипта, вы загрузили пять книг в таблицу с помощью API BatchWriteItem. У каждой книги есть атрибуты Author и Title для первичного ключа и атрибуты Category и Formats для хранения дополнительной информации о книге. У каждого атрибута есть тип, который может быть простым (например, строка для атрибута Category) или составным (например, перечень для атрибута Formats).

    Обратите внимание, что вы вставили данные через API HTTP с помощью клиентской библиотеки Boto 3. Все запросы на доступ к данным и операции с ними выполняются посредством HTTP-запросов, а не путем поддержания постоянного подключения к базе данных, как это принято при работе с системами управления реляционными базами данных.

  • Шаг 3. Получение элементов из таблицы

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

    В терминале AWS Cloud9 выполните указанную ниже команду.

    $ python get_item.py

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

    import boto3
    
    dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
    table = dynamodb.Table('Books')
    
    resp = table.get_item(Key={"Author": "John Grisham", "Title": "The Rainmaker"})
    
    print(resp['Item'])

    В терминале должны отобразиться полные данные о книге, полученные из таблицы.

    $ python get_item.py
    {'Title': 'The Rainmaker', 'Formats': {'Hardcover': 'J4SUKVGU', 'Paperback': 'D7YF4FCX'}, 'Author': 'John Grisham', 'Category': 'Suspense'}

    Так как каждый элемент в таблице имеет уникальный идентификатор в виде первичного ключа, вызов API GetItem всегда возвращает не более одного элемента из таблицы.


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