¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Tablas y elementos en DynamoDB

Después de esta lección: Puedo leer y escribir un elemento de DynamoDB con sus tipos.

Lección de 55 min5 comandosLaboratorio Cloud: practica con buckets S3, colas SQS y tablas DynamoDB desde la línea de comandos de AWS

Guardar un pedido

Una librería guarda cada pedido para encontrarlo más tarde. Una tabla de DynamoDB hace ese trabajo.

A diferencia de una hoja de cálculo, cada valor de un elemento de DynamoDB dice de qué tipo es. Esta lección enseña a leer y escribir esos valores con tipo en Python.

Al final de esta lección

Nota

Puedo leer y escribir un elemento de DynamoDB con sus tipos.

Palabras clave

PalabraQué significaEjemplo
Tablauna colección con nombre de elementos
Elementoun registro de una tabla
Atributoun valor con nombre dentro de un elemento
Letra de tipoel código que dice qué clase de valor esS
Conjunto de textosun grupo de textos distintos sin orden

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Cada valor lleva su letra de tipo

Una tabla de DynamoDB guarda elementos. Un elemento es un conjunto de atributos, cada uno con nombre y valor.

El valor es un diccionario con una sola clave, una letra de tipo, como {"S": "cafe"}. S es un texto y N es un número. BOOL es verdadero o falso, y NULL es la ausencia de valor.

Ejemplo resuelto: las letras de tipo

LetraContieneEjemplo
Sun texto{"S": "cafe"}
Nun número, escrito como texto{"N": "4"}
BOOLverdadero o falso{"BOOL": false}
NULLningún valor{"NULL": true}
SSun conjunto de textos, sin orden fijo{"SS": ["urgente", "fragil"]}

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Leer un elemento

Código: python
answer = {
    "Item": {
        "client": {"S": "lucia"},
        "gift": {"BOOL": False},
        "note": {"NULL": True},
        "order_id": {"N": "1"},
        "product": {"S": "cafe"},
        "status": {"S": "pagado"},
        "tags": {"SS": ["urgente", "fragil"]},
        "total": {"N": "4"},
    }
}
item = answer["Item"]
for name in item:
    kind = list(item[name].keys())[0]
    print(name, "es de tipo", kind)
print("producto:", item["product"]["S"])
# Añade una línea que muestre el estado.

Un número viaja como texto

DynamoDB envía cada número como un texto, como {"N": "15"}, para que cada cifra llegue tal como se escribió.

Para usarlo, conviértelo con int("15") o float("2.5"). Para guardarlo, vuelve a pasarlo a texto con str.

Ejemplo resuelto: usar un número

PasoPythonResultado
Leertotal["N"]"15"
Convertirint(total["N"])15
Sumar unoint(total["N"]) + 116
Volver a escribir{"N": str(16)}{"N": "16"}

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Texto frente a número

Código: python
total = {"N": "15"}
print(total["N"] + "1")
print(int(total["N"]) + 1)
print("9" > "15", 9 > 15)
print({"N": str(16)})
# Cambia "15" por "40". ¿Qué muestra ahora cada línea?

Un error frecuente

Advertencia

Mucha gente cree que {"N": "15"} ya es el número 15 en Python. Viaja como el texto "15". Si le sumas algo, une textos: "15" + "1" da "151". Convierte con int o float antes de sumar, y usa str para volver a escribirlo.

Un elemento ausente es una respuesta vacía

Pedir un elemento que no existe no es un error. get_item responde sin la clave Item.

Una escritura con condición, como «solo si este pedido es nuevo», puede ser rechazada. El error tiene el Code ConditionalCheckFailedException y el estado 400. El archivo capturado lo escribe como {"error": ...}. boto3 lanza una excepción que lleva el mismo Code y estado.

Encontrado, ausente y rechazado

Código: python
found = {"Item": {"client": {"S": "lucia"}, "note": {"NULL": True}}}
missing = {}
refused = {"error": {"Code": "ConditionalCheckFailedException", "HTTPStatusCode": 400}}
for answer in [found, missing]:
    if "Item" in answer:
        print("encontrado, la nota es nula:", answer["Item"]["note"]["NULL"])
    else:
        print("no existe ese elemento")
print(refused["error"]["Code"], refused["error"]["HTTPStatusCode"])
# Cambia la nota a {"S": "tarjeta regalo"} y léela con ["S"].

Pruébalo en el laboratorio de nube

El laboratorio de nube es una copia de práctica de S3, SQS y DynamoDB. Pulsa Iniciar el laboratorio en la barra y luego Ejecutar en cada orden de abajo. Usan la línea de comandos real de AWS, así que las mismas palabras sirven en una cuenta real. La última orden no imprime nada: aquí un elemento que falta es una respuesta vacía, no un error. Este paso es para practicar. La tarea de abajo sigue siendo Python simple, así que puedes hacerla sin el laboratorio.

Pon una clave inventada y la dirección

Comando
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Crea una tabla

Comando
aws dynamodb create-table --table-name Orders --attribute-definitions AttributeName=customer,AttributeType=S AttributeName=order,AttributeType=S --key-schema AttributeName=customer,KeyType=HASH AttributeName=order,KeyType=RANGE --billing-mode PAY_PER_REQUEST --query TableDescription.TableStatus

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Añade un elemento

Comando
aws dynamodb put-item --table-name Orders --item '{"customer":{"S":"ada"},"order":{"S":"1001"},"total":{"N":"12"}}'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lee el elemento

Comando
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"1001"}}'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Lee un elemento que no existe

Comando
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"9999"}}'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Sobre este laboratorio y su código: Laboratorio Cloud: practica con buckets S3, colas SQS y tablas DynamoDB desde la línea de comandos de AWS

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.