J'ai dû écrire (mettre à jour) plusieurs enregistrements sur DynamoDB, j'ai donc publié un article parce que je voulais écrire les résultats de la mise en œuvre et les mises en garde. Je publierai également une implémentation en Python et Node.js
Le tableau à écrire cette fois est supposé être le suivant Nom de la table: Utilisateurs Les colonnes et les types (le schéma lui-même n'a pas de type, mais il est décidé comme type de données à enregistrer par commodité) sont les suivants.
ami assume une liste de cartes avec identifiant, nom, clés d'adresse Cette fois, même s'il s'agit d'un type compliqué (tapez comme ami de la table utilisateur), c'est l'une des choses que je veux montrer qu'elle peut être écrite, donc j'ignorerai si la conception de la table est la meilleure en premier lieu.
Cette fois, je publierai le code qui fonctionne sur Lambda, donc je suppose que Lambda est prêt pour lui-même
Exemple de code entier → Commentaire léger J'écrirai dans la procédure de, et à la fin je posterai des éléments supplémentaires communs
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"] #Ce qu'il faut retourner est approprié
except Exception as e:
print(e)
La manière d'écrire le code et les données à écrire ne sont pas essentielles, il est donc normal de les faire passer.
L'important est que le contenu de la fonction ʻupdate_users utilise la méthode
batch_writequi grandit dans l'instance de modèle DynamoDB. Autrement dit, lorsque vous voulez écrire plusieurs fois, faites
PUT` dans le bloc suivant.
with table.batch_write() as batch:
# ...Abréviation
De plus, lorsque PUT
est terminé, par exemple, batch.put_item
est appelé.
Décrivez le contenu de l'écriture dans l'argument nommé ʻItem de ce type Et un autre point à noter est que même s'il s'agit d'un type appelé List [Map], il peut être écrit sans problème. Fondamentalement, n'importe quel type peut être écrit correctement dans la base de données en tant que valeur de la clé spécifiée, donc en bref, il n'y a pas de problème si vous passez simplement le dictionnaire que vous souhaitez mettre à jour à ʻItem
.
Enfin, comme petit supplément, je tourne l'instruction for
à l'intérieur du bloc batch_write
, mais bien sûr, vous pouvez écrire le batch.put_item
plusieurs fois en solide, donc si vous ne pouvez pas l'écrire avec l'instruction for
Parfois tu dois juste le faire solidement
En outre, il est dit que le nombre maximum d'éléments qui peuvent être écrits en même temps est de 25, mais il semble que s'il y a 25 éléments ou plus, ils renverront ou feront ce qu'ils veulent, il semble donc que vous pouvez écrire du code sans vous soucier du nombre d'éléments.
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
}
}
}))
}
};
//le rappel est approprié
dynamoDB.batchWrite(params, (e, data) => {
if (e) {
context.fail(e);
} else {
context.succeed(data);
}
});
};
Comme mentionné dans l'explication en Python, le code et les valeurs de données eux-mêmes sont traversants.
L'important ici est la propriété (fonction) appelée batchWrite
dans ʻAWS.DynamoDB.DocumentClient. Cet argument est assez original, donc [Classe: AWS.DynamoDB.DocumentClient - AWS SDK for JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/DocumentClient.html#batchWrite- propriété) Lorsque j'ai examiné plusieurs écritures dans Node.js, j'ai souvent vu
batchWriteItem, mais le dernier environnement d'exécution Node.js actuellement disponible dans Lambda (à partir de septembre 2020). Il semble que je ne le ferai pas, donc ça ne bouge pas et c'est difficile La grande différence avec
batchWriteItem est que l'objet de ʻItem
n'a pas besoin d'être un objet typé spécifique à DynamoDB (tel que name: {" S ":" user "}
).
En bref, si vous ne vous souciez pas de la valeur que vous voulez écrire et convertissez-la simplement en JSON et passez-la comme valeur de ʻItem`, cela fonctionnera sans problème.
Par conséquent, bien sûr, même un type compliqué appelé Map [List] peut être écrit en le passant tel quel.
Si vous souhaitez mettre à jour dans le traitement par lots, vous devez utiliser PUT
La raison est simple et il n'y a pas de ʻUPDATE, donc il ne peut pas être aidé, il est donc nécessaire de le décrire régulièrement avec
PUT. De plus, comme vous pouvez faire
DELETE` dans le processus par lots, je ne me suis pas concentré cette fois, mais je dirai simplement qu'il y a ...
Qu'as-tu pensé Je vois souvent des articles avec du code et une ou deux lignes d'explication pour plusieurs opérations, mais je ne vois pas beaucoup d'explications spécifiquement pour l'écriture (on ne sait pas si même des types compliqués peuvent être utilisés). , En premier lieu, ce sera une erreur lors de l'exécution), je l'ai fait un peu et c'était difficile, alors je l'ai écrit sous forme de mémorandum C'est peut-être un domaine légèrement spécialisé, mais j'espère que vous le trouverez utile.
Amazon DynamoDB — Boto3 Docs 1.14.56 documentation Class: AWS.DynamoDB.DocumentClient — AWS SDK for JavaScript
Recommended Posts