Eine Bestellung speichern
Ein Shop speichert jede Bestellung, um sie später wiederzufinden. Genau das erledigt eine DynamoDB-Tabelle.
Anders als in einer Tabellenkalkulation sagt in DynamoDB jeder Wert in einem Item selbst, welchen Typ er hat. In dieser Lektion lernen Sie, solche typisierten Werte in Python zu lesen und zu schreiben.
Am Ende dieser Lektion
Notiz
Ich kann ein DynamoDB-Item in seiner typisierten Form lesen und schreiben.
Schlüsselwörter
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Tabelle | eine benannte Sammlung von Items | |
| Item | ein einzelner Datensatz in einer Tabelle | |
| Attribut | ein benannter Wert in einem Item | |
| Typkennung | der Code, der sagt, welche Art Wert es ist | S |
| String-Set | eine Gruppe verschiedener Strings ohne Reihenfolge |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Jeder Wert trägt seine Typkennung
Eine DynamoDB-Tabelle enthält Items. Ein Item ist eine Menge von Attributen, jedes mit Namen und Wert.
Der Wert ist ein Dictionary mit einem einzigen Eintrag, einer Typkennung, etwa {"S": "Kaffee"}. S ist ein String und N eine Zahl. BOOL ist wahr oder falsch, und NULL heißt: kein Wert.
Beispiel: die Typkennungen
| Kennung | Enthält | Beispiel |
|---|---|---|
| S | einen String | {"S": "Kaffee"} |
| N | eine Zahl, als Text geschrieben | {"N": "4"} |
| BOOL | wahr oder falsch | {"BOOL": false} |
| NULL | keinen Wert | {"NULL": true} |
| SS | ein String-Set in beliebiger Reihenfolge | {"SS": ["eilig", "zerbrechlich"]} |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Run: ein Item lesen
antwort = {
"Item": {
"artikel": {"S": "Kaffee"},
"bestell_id": {"N": "1"},
"geschenk": {"BOOL": False},
"kunde": {"S": "jonas"},
"notiz": {"NULL": True},
"status": {"S": "bezahlt"},
"summe": {"N": "4"},
"tags": {"SS": ["eilig", "zerbrechlich"]},
}
}
item = antwort["Item"]
for name in item:
kennung = list(item[name].keys())[0]
print(name, "hat den Typ", kennung)
print("Artikel:", item["artikel"]["S"])
# Fügen Sie eine Zeile hinzu, die den Status ausgibt.
Eine Zahl reist als Text
DynamoDB schickt jede Zahl als String, etwa {"N": "15"}, damit jede Ziffer genau so ankommt, wie sie geschrieben wurde.
Um damit zu rechnen, wandeln Sie sie mit int("15") oder float("2.5") um. Um eine zu speichern, machen Sie mit str wieder Text daraus.
Beispiel: mit einer Zahl rechnen
| Schritt | Python | Ergebnis |
|---|---|---|
| Lesen | summe["N"] | "15" |
| Umwandeln | int(summe["N"]) | 15 |
| Eins addieren | int(summe["N"]) + 1 | 16 |
| Zurückschreiben | {"N": str(16)} | {"N": "16"} |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Run: Text gegen Zahl
summe = {"N": "15"}
print(summe["N"] + "1")
print(int(summe["N"]) + 1)
print("9" > "15", 9 > 15)
print({"N": str(16)})
# Ändern Sie "15" in "40". Was gibt jetzt jede Zeile aus?
Ein häufiger Fehler
Warnung
Viele denken, {"N": "15"} enthalte die Zahl 15. Es enthält den Text "15". Addieren Sie etwas, hängen Sie Text aneinander, also ergibt "15" + "1" den Text "151". Wandeln Sie vor jeder Rechnung mit int oder float um und schreiben Sie mit str zurück.
Ein fehlendes Item ist eine leere Antwort
Ein Item abzufragen, das es nicht gibt, ist kein Fehler. get_item antwortet ganz ohne Item-Eintrag.
Ein Schreibzugriff mit Bedingung, etwa "nur wenn die Bestellung neu ist", kann abgelehnt werden. Der Fehler hat den Code ConditionalCheckFailedException und den Status 400. Die aufgezeichnete Datei schreibt ihn als {"error": ...}. boto3 löst eine Ausnahme aus, die denselben Code und Status trägt.
Run: gefunden, fehlt und abgelehnt
gefunden = {"Item": {"kunde": {"S": "jonas"}, "notiz": {"NULL": True}}}
fehlt = {}
abgelehnt = {"error": {"Code": "ConditionalCheckFailedException", "HTTPStatusCode": 400}}
for antwort in [gefunden, fehlt]:
if "Item" in antwort:
print("gefunden, Notiz ist null:", antwort["Item"]["notiz"]["NULL"])
else:
print("kein solches Item")
print(abgelehnt["error"]["Code"], abgelehnt["error"]["HTTPStatusCode"])
# Ändern Sie die Notiz in {"S": "Geschenkkarte"} und lesen Sie sie mit ["S"].
Probieren Sie es im Cloud-Lab aus
Das Cloud-Lab ist eine Übungskopie von S3, SQS und DynamoDB. Klicken Sie in der Leiste auf Lab starten und dann bei jedem Befehl unten auf Ausführen. Sie benutzen die echte AWS-Befehlszeile, dieselben Wörter funktionieren also bei einem echten Konto. Der letzte Befehl gibt nichts aus: Ein fehlender Eintrag ist hier eine leere Antwort, kein Fehler. Dieser Schritt dient zum Üben. Die Aufgabe unten bleibt einfaches Python, Sie können sie also ohne das Lab lösen.
Schlüssel und Adresse des Labs setzen
export AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test AWS_DEFAULT_REGION=us-east-1 AWS_ENDPOINT_URL=http://cloud:4566Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Eine Tabelle anlegen
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.TableStatusHier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Eintrag speichern
aws dynamodb put-item --table-name Orders --item '{"customer":{"S":"ada"},"order":{"S":"1001"},"total":{"N":"12"}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Den Eintrag lesen
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"1001"}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.
Einen Eintrag lesen, den es nicht gibt
aws dynamodb get-item --table-name Orders --key '{"customer":{"S":"ada"},"order":{"S":"9999"}}'Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.