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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Tabla | una colección con nombre de elementos | |
| Elemento | un registro de una tabla | |
| Atributo | un valor con nombre dentro de un elemento | |
| Letra de tipo | el código que dice qué clase de valor es | S |
| Conjunto de textos | un 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
| Letra | Contiene | Ejemplo |
|---|---|---|
| S | un texto | {"S": "cafe"} |
| N | un número, escrito como texto | {"N": "4"} |
| BOOL | verdadero o falso | {"BOOL": false} |
| NULL | ningún valor | {"NULL": true} |
| SS | un 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
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
| Paso | Python | Resultado |
|---|---|---|
| Leer | total["N"] | "15" |
| Convertir | int(total["N"]) | 15 |
| Sumar uno | int(total["N"]) + 1 | 16 |
| 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
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
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
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566Se 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
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.TableStatusSe 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
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
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
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.