J'espère que quelqu'un pourra faire la lumière sur ce problème avec lequel je me débat.
J'ai cette table en dynamo, appelons-la people
,在这个表中,我有 id
的属性作为我们的分区键、name
、lastname
和 status
.
Je souhaite pouvoir mettre à jour une seule propriété ou enregistrer toutes les propriétés de l'identifiant.
Maintenant, c'est comme ça que je procède. J'ai créé la structure suivante :
type personupdate struct { firstname string `json:"firstname,omitempty"` lastname string `json:"lastname,omitempty"` status string `json:"status,omitempty"` }
La requête du serveur met simplement à jour le nom de famille de la personne, le corps de notre requête ressemblera donc à ceci :
{ "lastname": "bob" }
Après avoir lié la requête à la structure, l'objet qui sera envoyé à dynamo ressemblera à ceci :
{ "firstname": "", "lastname": "bob", "status": "", }
Maintenant, comme vous pouvez le voir, lorsqu'il est temps d'écrire sur Dynamo, une seule propriété doit être mise à jour et les autres propriétés vides/vides doivent être ignorées.
Le code écrit pour ce faire peut être condensé comme suit :
// marshal our object _, err := dynamodbattribute.marshalmap(person) if err != nil{ fmt.println("some error marshaling") } // create our update input input := &dynamodb.updateiteminput{ key: map[string]*dynamodb.attributevalue{ "id":{ s: aws.string("1234"), }, }, tablename: aws.string("people"), expressionattributevalues: map[string]*dynamodb.attributevalue{ ":fn": { s: aws.string(person.firstname), }, ":ln":{ s: aws.string(person.lastname), }, ":st":{ s: aws.string(person.status), }, }, updateexpression: aws.string("set firstname = :fn, lastname = :ln, status = :st"), returnvalues: aws.string("updated_new"), } // send update request to dynamo _, err := service.updateitem(input)
Maintenant, il n'y a aucun problème avec la mise à jour, le problème est le drapeau firstname
和 status
的 null 值也被传递。我尝试过阅读他们的文档,但还是有点困惑。我知道java sdk允许您传递一个名为update_skip_null_attributes
, qui vous permet d'ignorer ces valeurs nulles et de mettre à jour uniquement les valeurs qui contiennent des données. Je ne sais pas quel est l'équivalent, toute aide/conseil serait formidable.
Mise à jour :
Essayez d'utiliser les modèles suivants :
type usermodel struct { firstname string `json:"firstname,omitempty" dynamodbav:"firstname,omitempty"` lastname string `json:"lastname,omitempty" dynamodbav:"lastname,omitempty"` }
Suivez les conseils donnés par @jarmod et @fedonev. Logiquement et en utilisant la documentation il est possible de comprendre pourquoi cela devrait fonctionner, malheureusement ce n'est pas le cas
J'ai décidé de passer le SDK de la v1 à la v2 pour voir si sa mise à jour aiderait, même si je suis à nouveau coincé dans la même situation. Voici à quoi ressemble ma fonction de mise à jour.
update :=expression.Set(expression.Name("firstName"),expression.Value(user.FirstName)) update.Set(expression.Name("lastName"), expression.Value(user.LastName)) expr, err := expression.NewBuilder().WithUpdate(update).Build() if err != nil { "log error here..." } _, err = svc.UpdateItem(context.TODO(), &dynamodb.UpdateItemInput{ TableName: aws.String("people"), Key: map[string]types.AttributeValue{"id": id}, ExpressionAttributeNames: expr.Names(), ExpressionAttributeValues: expr.Values(), UpdateExpression: expr.Update(), ReturnValues: types.ReturnValueUpdatedNew, }) if err != nil { "log error here..." }
J'ai fini par résoudre mon problème en écrivant une requête et en créant une fonction qui interroge à peu près la charge utile json par l'identifiant que nous voulons mettre à jour et les mises à jour en fonction de la différence de ce que nous devons interroger, tous les champs vides seront interrogés. Remplacement du résultat. Jusqu'à présent, cela a résolu mon problème, mais je me demande toujours comment le mettre à jour avec ses fonctionnalités prévues.
Comme le commentaire de @jarmod le dit, les champs de valeur zéro sont ignorés lors de l'application de dynamodbav:",omitempty"
balises aux structures de regroupement :
type personupdate struct { firstname string `json:"firstname,omitempty" dynamodbav:",omitempty"` lastname string `json:"lastname,omitempty" dynamodbav:",omitempty"` status string `json:"status,omitempty" dynamodbav:",omitempty"` }
[EDIT : Utilisation ajoutée] marshalmap
Les champs de valeur nulle seront désormais ignorés, en respectant les étiquettes. Parcourez la carte pour construire une expression de mise à jour :
av, _ := attributevalue.MarshalMap(person) update := expression.UpdateBuilder{} for k, v := range av { update = update.Set(expression.Name(k), expression.Value(v)) }
Construisez l'expression et transmettez sa sortie à updateitem
comme indiqué dans l'op.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!