Enregistrer une commande
Une boutique enregistre chaque commande pour la retrouver plus tard. Une table DynamoDB fait ce travail.
Contrairement à un tableur, chaque valeur d’un élément DynamoDB dit de quel type elle est. Cette leçon montre comment lire et écrire ces valeurs typées en Python.
À la fin de cette leçon
Remarque
Je peux lire et écrire un élément DynamoDB sous sa forme typée.
Mots-clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Table | un ensemble nommé d’éléments | |
| Élément | un enregistrement d’une table | item |
| Attribut | une valeur nommée à l’intérieur d’un élément | |
| Lettre de type | le code qui dit quelle sorte de valeur c’est | S |
| Ensemble de chaînes | un groupe de chaînes différentes, sans ordre |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque valeur porte sa lettre de type
Une table DynamoDB contient des éléments. Un élément est un ensemble d’attributs, chacun avec un nom et une valeur.
La valeur est un dictionnaire à une seule clé, une lettre de type, comme {"S": "thé"}. S est une chaîne et N un nombre. BOOL vaut vrai ou faux, et NULL veut dire aucune valeur.
Exemple travaillé : les lettres de type
| Lettre | Contient | Exemple |
|---|---|---|
| S | une chaîne | {"S": "thé"} |
| N | un nombre, écrit en texte | {"N": "4"} |
| BOOL | vrai ou faux | {"BOOL": false} |
| NULL | aucune valeur | {"NULL": true} |
| SS | un ensemble de chaînes, sans ordre fixe | {"SS": ["urgent", "fragile"]} |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Lire un élément
reponse = {
"Item": {
"client": {"S": "ana"},
"cadeau": {"BOOL": False},
"article": {"S": "thé"},
"note": {"NULL": True},
"numero_commande": {"N": "1"},
"statut": {"S": "payée"},
"etiquettes": {"SS": ["urgent", "fragile"]},
"total": {"N": "4"},
}
}
element = reponse["Item"]
for nom in element:
for lettre in element[nom]:
print(nom, "a pour type", lettre)
print("article :", element["article"]["S"])
# Ajoutez une ligne qui affiche le statut.
Un nombre voyage en texte
DynamoDB envoie chaque nombre comme une chaîne, par exemple {"N": "15"}, pour que chaque chiffre arrive tel qu’il a été écrit.
Pour l’utiliser, convertissez-le avec int("15") ou float("2.5"). Pour l’enregistrer, remettez-le en texte avec str.
Exemple travaillé : utiliser un nombre
| Étape | Python | Résultat |
|---|---|---|
| Lire | total["N"] | "15" |
| Convertir | int(total["N"]) | 15 |
| Ajouter un | int(total["N"]) + 1 | 16 |
| Réécrire | {"N": str(16)} | {"N": "16"} |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Le texte contre le nombre
total = {"N": "15"}
print(total["N"] + "1")
print(int(total["N"]) + 1)
print("9" > "15", 9 > 15)
print({"N": str(16)})
# Remplacez "15" par "40". Que donne chaque ligne maintenant ?
Erreur fréquente
Attention
Beaucoup croient que {"N": "15"} contient le nombre 15. Il contient le texte « 15 ». Ajouter à un texte, c’est le coller : "15" + "1" donne « 151 ». Convertissez avec int ou float avant toute somme, et utilisez str pour réécrire.
Un élément absent donne une réponse vide
Demander un élément qui n’existe pas n’est pas une erreur. get_item répond sans aucune clé Item.
Une écriture avec condition, comme « seulement si cette commande est nouvelle », peut être refusée. L’erreur a le Code ConditionalCheckFailedException et le statut 400. Le fichier capturé l’écrit {"error": ...}. boto3 lève une exception qui porte le même Code et le même statut.
Trouvé, absent et refusé
trouve = {"Item": {"client": {"S": "ana"}, "note": {"NULL": True}}}
absent = {}
refuse = {"error": {"Code": "ConditionalCheckFailedException", "HTTPStatusCode": 400}}
for reponse in [trouve, absent]:
if "Item" in reponse:
print("trouvé, la note est nulle :", reponse["Item"]["note"]["NULL"])
else:
print("aucun élément")
print(refuse["error"]["Code"], refuse["error"]["HTTPStatusCode"])
# Remplacez la note par {"S": "carte cadeau"}, puis lisez-la avec ["S"].
Essayez-le dans le lab cloud
Le lab cloud est une copie d'entraînement de S3, SQS et DynamoDB. Appuyez sur Démarrer le lab dans la barre, puis sur Exécuter pour chaque commande ci-dessous. Elles utilisent la vraie ligne de commande AWS, les mêmes mots marchent donc sur un vrai compte. La dernière commande n'affiche rien : un élément absent est ici une réponse vide, pas une erreur. Cette étape sert à s'exercer. Le travail ci-dessous reste du Python simple : vous pouvez le faire sans le lab.
Donnez une clé inventée et l'adresse du lab
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Créez une table
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.TableStatusAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ajoutez un élément
aws dynamodb put-item --table-name Orders --item '{"customer":{"S":"ada"},"order":{"S":"1001"},"total":{"N":"12"}}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lisez l'élément
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"1001"}}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Lisez un élément qui n'existe pas
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"9999"}}'Affichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.