In questa lezione, passerai in rassegna alcuni semplici esempi di inserimento e recupero di dati con DynamoDB. Dovrai creare la tabella DynamoDB utilizzando l'API CreateTable, quindi dovrai inserire alcuni elementi utilizzando la chiamata API BatchWriteItem. Infine, recupererai singoli elementi con la chiamata API GetItem. Prima di passare in rassegna questi esempi, parleremo del modello di dati da utilizzare nella tua applicazione per libreria online di esempio.

Nei moduli successivi, scoprirai come recuperare più elementi contemporaneamente utilizzando la chiamata API Query nonché come abilitare altri pattern di query utilizzando indici secondari. Imparerai anche ad aggiornare gli elementi esistenti nella tua tabella.

Tempo necessario per completare il modulo: 15 minuti


I seguenti concetti DynamoDB svolgono un ruolo fondamentale in questo modulo:

  • Tabella: una raccolta di record di dati DynamoDB.
  • Elemento: un unico record di dati in una tabella DynamoDB. È paragonabile a una riga in un database relazionale.
  • Attributo: un unico elemento dati in un elemento. È paragonabile a una colonna in un database relazionale. Tuttavia, a differenza delle colonne nei database relazionali, gli attributi non devono essere specificati all'atto della creazione della tabella, se non nel caso della chiave principale che verrà illustrata di seguito in questo modulo. Gli attributi possono essere tipi semplici come stringhe, numeri interi od operatori booleani, oppure possono essere tipi complessi come elenchi o mappe.
  • Chiave principale: una chiave principale è un identificativo univoco per un unico elemento in una tabella DynamoDB. Il nome e il tipo della chiave principale devono essere specificati all'atto della creazione della tabella e una chiave principale del tipo specificato deve essere inclusa in ciascun elemento scritto in una tabella. Una chiave principale semplice consiste in solo attributo e una chiave principale composta consiste in due attributi: una chiave di partizione e una chiave di ordinamento. Ad esempio, puoi creare una chiave principale semplice utilizzando "UserID" come identificativo o puoi creare una chiave principale composta unendo "UserID" e "Creation_Date" come identificativo dell'elemento.

Durante la creazione di un'applicazione, devi sempre trovare il tempo per progettare i modelli di dati necessari nella logica applicativa scelta. Questo progetto di modello di dati deve tenere conto delle esigenze di accesso ai dati che occorreranno nella tua applicazione, sia per la lettura che per la scrittura di dati.

DynamoDB è un database non relazionale. Con i database non relazionali, non è necessario specificare anticipatamente lo schema completo al momento della creazione della tabella. È sufficiente dichiarare la chiave principale della tabella, che identifica in modo univoco ciascun record nella tabella. Ciò riduce il costo anticipato della progettazione del modello dati, perché puoi facilmente modificare lo schema in funzione delle variazioni nelle esigenze della tua applicazione.

Come citato nella sezione "Background dell'applicazione" dell'"Introduzione" di questo tutorial, la tua applicazione deve poter recuperare un singolo libro mediante il titolo e l'autore. Poiché la combinazione di titolo e autore rappresenta un identificatore univoco di un libro, puoi utilizzare tali attributi come chiave principale della tabella. La tua applicazione deve anche essere in grado di archiviare le informazioni sulla categoria del libro in questione, quali storia e biografia, oltre ai formati disponibili del libro (copertina rigida, tascabile o audiolibro) che sono collegati ai codici articolo nel tuo sistema di inventario.

Tenendo conto di queste esigenze, puoi utilizzare il seguente schema per la tua tabella:

  • Titolo (una stringa): Il titolo del libro
  • Autore (una stringa): l'autore del libro
  • Categoria (una stringa) La categoria del libro, come Storia, Biografia e Fantascienza
  • Formati (una mappa): I diversi formati disponibili alla vendita (copertina rigida, tascabile e audiolibro) e i rispettivi codici articolo nel tuo sistema di inventario

Nelle fasi seguenti, dovrai creare la tabella specificando la chiave principale composta (Autore e Titolo) della tabella. Quindi, caricherai alcuni elementi nella tabella e leggerai i singoli elementi dalla tabella stessa.


  • Fase 1. Creazione di una tabella DynamoDB

    La directory che hai scaricato include uno script create_table.py che crea una tabella Libri con l'ausilio dell'API CreateTable. Per eseguire questo script, devi inserire il seguente comando nel terminale AWS Cloud9.

    $ python create_table.py

    Se apri lo script create_table.py con l'editor AWS Cloud9, dovresti vedere:

    • Lo script specifica la chiave principale composta della tabella con l'argomento KeySchema nella chiamata API CreateTable. La tabella utilizza Autore come chiave hash e Titolo come chiave range.
    • Lo script specifica il throughput assegnato alla tabella definendo sia le unità della capacità di lettura che le unità della capacità di scrittura. DynamoDB ti consente di impostare la capacità di lettura e scrittura separatamente, permettendoti di regolare finemente la configurazione per soddisfare le esigenze della tua applicazione, senza dover sostenere il costo oneroso dell'assegnazione eccessiva.
  • Fase 2. Caricamento di elementi nella tabella

    In questa fase, dovrai caricare alcuni libri nella tabella. Nel terminale AWS Cloud9, esegui il comando seguente.
    $ python insert_items.py
    Questo comando esegue il seguente script.
    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" } })
    

    Come mostra lo script precedente, hai utilizzato l'API BatchWriteItem per caricare cinque libri nella tabella. Ogni libro include gli attributi Autore e Titolo per la chiave principale e gli attributi Categoria e Formati come informazioni ulteriori sui libri. Ogni attributo è dotato di un tipo, che può essere semplice come una stringa per l'attributo Categoria, o complesso come una mappa per l'attributo Formati.

    Osserva che hai inserito i dati su un'API HTTP utilizzando la libreria client Boto 3. Tutte le richieste di accesso e di manipolazione dei dati vengono eseguite tramite richieste HTTP, per evitare di mantenere una connessione persistente al database come è comune per i sistemi di gestione dei database relazionali.

  • Fase 3. Recupero di elementi dalla tabella

    Puoi recuperare un unico libro utilizzando la richiesta API GetItem specificando la chiave principale dell'elemento che desideri.

    Nel terminale AWS Cloud9, esegui il comando seguente.

    $ python get_item.py

    Viene così eseguito il seguente script per recuperare un unico elemento, che è il libro L'uomo della pioggia di 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'])

    Il tuo terminale dovrebbe quindi stampare i dati completi dei libri recuperati dalla tabella.

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

    Poiché ciascun elemento di una tabella è identificato in modo univoco dalla relativa chiave principale, la chiamata API GetItem restituisce sempre al massimo un elemento dalla tua tabella.


    Nel modulo successivo, imparerai come recuperare più elementi da una tabella DynamoDB con un'unica chiamata API. Scoprirai anche come abilitare più pattern di accesso ai dati nella tabella con l'ausilio degli indici secondari.