Ejemplo de update_item en dynamodb boto3

3 minutos de lectura

Avatar de usuario de Dmitry R
Dmitri R.

Siguiente la documentaciónestoy tratando de crear una declaración de actualización que actualizará o agregará, si no existe, solo un atributo en una tabla de dynamodb.

estoy intentando esto

response = table.update_item(
    Key={'ReleaseNumber': '1.0.179'},
    UpdateExpression='SET',
    ConditionExpression='Attr(\'ReleaseNumber\').eq(\'1.0.179\')',
    ExpressionAttributeNames={'attr1': 'val1'},
    ExpressionAttributeValues={'val1': 'false'}
)

El error que estoy recibiendo es:

botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: ExpressionAttributeNames contains invalid key: Syntax error; key: "attr1"

Si alguien ha hecho algo similar a lo que estoy tratando de lograr, por favor comparta un ejemplo.

  • Sé que es una pregunta muy antigua, pero me pregunto… si su elemento ya existe, “put_item” lo sobrescribirá. ¿Por qué debo usar update_item si no puedo cambiar ninguna clave_índice?

    – claudio

    7 sep 2021 a las 12:53

  • @Claudiu supongo que para actualizar no todo campos

    – mccc

    29 de noviembre de 2021 a las 12:32

  • Cabe señalar que su error original se refería a ExpressionAttributeNames que se excluyó de la muestra proporcionada en esta respuesta… aunque debe incluir todos los valores de la clave para actualizar un elemento, este no fue directamente el error que usted tenía originalmente.

    – Jaime

    23 de marzo de 2016 a las 3:44

  • Vale la pena mencionar, Key aquí debería tener todas las claves para eso index si Local Secondary Index o Global Secondary Index. Como aquí, ReleaseNumber es primary key y Timestamp es un sort key por defecto.

    – Abhishake Gupta

    28 de junio de 2019 a las 17:48

  • Esta solución no funcionó para mí, tuve que agregar ExpressionAttributeNames junto con ExpressionAttributeValues mientras actualiza el artículo.

    – AADProgramación

    24 oct 2020 a las 14:51

  • Intenté lo anterior pero no funcionó. intenté usar ExpressionAttributeNames pero aun así no funcionó. Obteniendo el error botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the UpdateItem operation: The provided key element does not match the schema

    – Matemáticas duras

    3 de diciembre de 2020 a las 19:43

  • Esta respuesta aceptada no funciona. La cola de edición para esta respuesta está llena, por lo tanto, no se puede editar. Otra respuesta a continuación debe marcarse como aceptada en su lugar, que usa “ExpressionAttributeNames”. stackoverflow.com/a/53201316/5600195

    – Utkarsh

    5 de febrero de 2022 a las 23:38


  • Aunque usar AttributeUpdates como este es correcto y aún debería funcionar (y me gusta más la sintaxis que UpdateExpression), la documentación menciona que este método es heredado (y, por lo tanto, es posible que ya no funcione en algún momento). Fuente: boto3.readthedocs.io/en/latest/reference/services/…

    – Aart Goossen

    25 de abril de 2018 a las 12:17

  • AttributeUpdates es un parámetro heredado en boto3, por lo que probablemente sea mejor usar UpdateExpression en la respuesta anterior de Dmitry R

    – gimbel0893

    23 de mayo de 2018 a las 14:26

  • AttributeUpdates parece una API mucho más limpia. 🙁

    –Andy Hayden

    25 de junio de 2018 a las 17:26

  • @AndyHayden AttributeUpdates es más simple, pero las expresiones son más poderosas porque se pueden parametrizar para manejar colisiones de palabras reservadas, inyección de código y otros problemas.

    – Davos

    8 de noviembre de 2018 a las 3:56

  • El hecho de que eliminen AttributeUpdates me molesta mucho.

    – Capitán Jack Sparrow

    14/10/2022 a las 20:09

  • +1 ya que esto es excelente, pero tenga en cuenta que tiene dos errores: 1. No maneja palabras clave reservadas (como el nombre) 2. No maneja atributos que comienzan con símbolos como __. Ambos problemas se pueden resolver usando ExpressionAttributeNames

    – orcamán

    3 de marzo de 2021 a las 11:06

  • ¿Por qué excluye el último elemento de su join ¿expresión?

    – Mark Ransom

    18 abr 2021 a las 18:33

  • @MarkRansom para eliminar la coma final

    – Jam M. Hernández Quiceno

    19 abr 2021 a las 15:38

  • Ah, no me di cuenta de que el segmento estaba en la cadena final y no en la lista. Tiene sentido ahora, gracias.

    – Mark Ransom

    19 abr 2021 a las 15:45

¿Ha sido útil esta solución?