Ich musste mehrere Datensätze in DynamoDB schreiben (aktualisieren), daher habe ich einen Artikel veröffentlicht, weil ich die Ergebnisse der Implementierung und Vorsichtsmaßnahmen aufschreiben wollte. Ich werde auch eine Implementierung in Python und Node.js veröffentlichen
Die diesmal zu schreibende Tabelle wird wie folgt angenommen Tabellenname: Benutzer Die Spalten und Typen (das Schema selbst hat keinen Typ, aber es wird als Datentyp festgelegt, der der Einfachheit halber registriert werden soll) sind wie folgt.
Freund nimmt eine Liste von Karten mit ID, Name, Adressschlüssel an Auch wenn es sich um einen komplizierten Typ handelt (Typ wie ein Freund der Benutzertabelle), möchte ich diesmal zeigen, dass er geschrieben werden kann. Daher werde ich ignorieren, ob das Tabellendesign überhaupt das beste ist.
Dieses Mal werde ich den Code veröffentlichen, der auf Lambda ausgeführt wird, also gehe ich davon aus, dass Lambda für sich selbst bereit ist
Ganzes Codebeispiel → Lichtkommentar Ich werde in der Prozedur von schreiben und am Ende werde ich gemeinsame ergänzende Artikel veröffentlichen
import boto3
from boto3.dynamodb.conditions import Key
def update_users(table, users_friends):
with table.batch_writer() as batch:
for n in range(3):
batch.put_item(
Item={
"id": n + 1,
"name": "user" + str(n + 1),
"address": "address" + str(n + 1),
"friends": users_friends[n]
}
)
def lambda_handler(event, context):
try:
dynamoDB = boto3.resource("dynamodb")
table = dynamoDB.Table("Users")
user1_friends = [
{ "id": 2, "name": "user2", "address": "address2" },
{ "id": 3, "name": "user3", "address": "address3" }
]
user2_friends = [
{ "id": 1, "name": "user1", "address": "address1" },
{ "id": 3, "name": "user3", "address": "address3" }
]
user3_friends = [
{ "id": 1, "name": "user1", "address": "address1" },
{ "id": 2, "name": "user2", "address": "address2" }
]
users_friends = [user1_friends, user2_friends, user3_friends]
update_users(table, users_friends)
return event["message"] #Was zurückzugeben ist angemessen
except Exception as e:
print(e)
Die Art und Weise, wie der Code und die zu schreibenden Daten geschrieben werden, ist nicht unbedingt erforderlich, daher ist es in Ordnung, sie durchzuarbeiten.
Wichtig ist, dass der Inhalt der Funktion "update_users" die Methode "batch_write" verwendet, die in der DynamoDB-Modellinstanz wächst.
Wenn Sie also mehrmals schreiben möchten, führen Sie im folgenden Block PUT
aus.
with table.batch_write() as batch:
# ...Abkürzung
Wenn beispielsweise "PUT" ausgeführt wird, wird "batch.put_item" aufgerufen. Beschreibe den Inhalt des Schreibens in dem Argument "Item" dieses Typen Ein weiterer zu beachtender Punkt ist, dass selbst wenn es sich um einen Typ namens List [Map] handelt, dieser problemlos geschrieben werden kann. Grundsätzlich kann jeder Typ ordnungsgemäß als angegebener Schlüsselwert in die Datenbank geschrieben werden. Kurz gesagt, es ist kein Problem, wenn Sie das Wörterbuch, das Sie aktualisieren möchten, so wie es ist auf "Item" übergeben. Als kleine Ergänzung drehe ich schließlich die "for" -Anweisung innerhalb des "batch_write" -Blocks, aber natürlich können Sie das "batch.put_item" mehrmals in Solid schreiben, wenn Sie es also nicht mit der "for" -Anweisung schreiben können Manchmal muss man es einfach solide machen Es wird auch gesagt, dass die maximale Anzahl von Elementen, die gleichzeitig geschrieben werden können, 25 beträgt. Wenn jedoch 25 oder mehr Elemente vorhanden sind, werden sie erneut gesendet oder tun, was sie wollen. Sie können also Code schreiben, ohne sich um die Anzahl der Elemente sorgen zu müssen.
const AWS = require("aws-sdk");
const dynamoDB = new AWS.DynamoDB.DocumentClient({
region: "ap-northeast-1"
});
const tableName = "Users";
exports.handler = (event, context) => {
const user1Friends = [
{ id: 2, name: "user2", address: "address2" },
{ id: 3, name: "user3", address: "address3" }
];
const user2Friends = [
{ id: 1, name: "user1", address: "address1" },
{ id: 3, name: "user3", address: "address3" }
];
const user3Friends = [
{ id: 1, name: "user1", address: "address1" },
{ id: 2, name: "user2", address: "address2" }
];
const usersFriends = [user1Friends, user2Friends, user3Friends]
const params = {
RequestItems: {
[tableName]: usersFriends.map((e, i) => ({
PutRequest: {
Item: {
id: i + 1,
name: `user${i + 1}`,
address: `address${i + 1}`,
friends: e
}
}
}))
}
};
//Rückruf ist angebracht
dynamoDB.batchWrite(params, (e, data) => {
if (e) {
context.fail(e);
} else {
context.succeed(data);
}
});
};
Wie in der Erklärung in Python erwähnt, sind die Code- und Datenwerte selbst durch.
Wichtig ist hier die Eigenschaft (Funktion) "batchWrite" in "AWS.DynamoDB.DocumentClient".
Dieses Argument ist ziemlich eigenartig, daher [Klasse: AWS.DynamoDB.DocumentClient - AWS SDK für JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#batchWrite- Eigentum)
Wenn ich mir mehrere Schreibvorgänge in Node.js angesehen habe, habe ich häufig batchWriteItem
gesehen, aber die neueste Node.js-Ausführungsumgebung, die derzeit in Lambda verfügbar ist (Stand September 2020). Es scheint, dass ich es nicht tun werde, also bewegt es sich nicht und es ist unerwartet schwierig
Der große Unterschied zu batchWriteItem
besteht darin, dass das Objekt von Item
kein DynamoDB-spezifisches typisiertes Objekt sein muss (z. B.name: {"S": "user"}
).
Kurz gesagt, wenn Sie sich nicht für den Wert interessieren, den Sie schreiben möchten, und ihn einfach in JSON konvertieren und als Wert von "Item" übergeben, funktioniert dies ohne Probleme.
Daher kann natürlich auch ein komplizierter Typ namens Map [List] geschrieben werden, indem er so übergeben wird, wie er ist.
Wenn Sie in der Stapelverarbeitung aktualisieren möchten, müssen Sie "PUT" verwenden Der Grund ist einfach und es gibt kein "UPDATE", daher kann nicht geholfen werden. Daher ist es notwendig, es stetig mit "PUT" zu beschreiben Außerdem habe ich mich diesmal nicht konzentriert, weil ich im Batch-Prozess "LÖSCHEN" ausführen kann, aber ich sage nur, dass es ...
Was haben Sie gedacht Ich sehe oft Artikel mit Code und ein oder zwei Erklärungszeilen für mehrere Operationen, aber ich sehe nicht viele Erklärungen speziell zum Schreiben (es ist unklar, ob auch komplizierte Typen verwendet werden können). Erstens wird es zur Laufzeit ein Fehler sein), ich habe es ein wenig gemacht und es war schwierig, also habe ich es als Memorandum niedergeschrieben Es mag ein kleines Nischenfeld sein, aber ich hoffe, Sie finden es nützlich.
Amazon DynamoDB — Boto3 Docs 1.14.56 documentation Class: AWS.DynamoDB.DocumentClient — AWS SDK for JavaScript
Recommended Posts