¿Cómo agregar un atributo de valor a lista en AWS DynamoDB?

Estoy usando DynamoDB como db KV (porque no hay mucha información, creo que está bien), y parte de ‘V’ es un tipo de lista (alrededor de 10 elementos). Hay alguna sesión para agregarle un nuevo valor, y no puedo encontrar la manera de hacerlo en 1 solicitud. Lo que hice es así:

item = self.list_table.get_item(**{'k': 'some_key'}) item['v'].append('some_value') item.partial_save() 

Primero solicito el servidor y lo guardo después de modificar el valor. Eso no es atómico y se ve feo. ¿Hay alguna manera de hacer esto en una solicitud?

El siguiente código debería funcionar con boto3:

 table = get_dynamodb_resource().Table("table_name") result = table.update_item( Key={ 'hash_key': hash_key, 'range_key': range_key }, UpdateExpression="SET some_attr = list_append(some_attr, :i)", ExpressionAttributeValues={ ':i': [some_value], }, ReturnValues="UPDATED_NEW" ) if result['ResponseMetadata']['HTTPStatusCode'] == 200 and 'Attributes' in result: return result['Attributes']['some_attr'] 

El método get_dynamodb_resource aquí es simplemente:

 def get_dynamodb_resource(): return boto3.resource( 'dynamodb', region_name=os.environ['AWS_DYNAMO_REGION'], endpoint_url=os.environ['AWS_DYNAMO_ENDPOINT'], aws_secret_access_key=os.environ['AWS_SECRET_ACCESS_KEY'], aws_access_key_id=os.environ['AWS_ACCESS_KEY_ID']) 

Puede hacer esto en 1 solicitud utilizando la API UpdateItem junto con un UpdateExpression . Ya que desea adjuntar a una lista, usaría la acción SET con la función list_append :

SET soporta las siguientes funciones:

  • list_append (operand, operand) : se evalúa como una lista con un nuevo elemento agregado. Puede agregar el nuevo elemento al inicio o al final de la lista invirtiendo el orden de los operandos.

Puede ver un par de ejemplos de esto en la documentación de Modificación de elementos y atributos con las expresiones de actualización :

  • El siguiente ejemplo agrega un nuevo elemento a la lista de revisión FiveStar . La expresión nombre de atributo #pr es ProductReviews ; el valor del atributo :r es una lista de un elemento. Si la lista tenía dos elementos, [0] y [1] , el nuevo elemento será [2] .

     SET #pr.FiveStar = list_append(#pr.FiveStar, :r) 
  • El siguiente ejemplo agrega otro elemento a la lista de revisión de FiveStar , pero esta vez el elemento se agregará al inicio de la lista en [0] . Todos los demás elementos de la lista se desplazarán en uno.

     SET #pr.FiveStar = list_append(:r, #pr.FiveStar) 

#pr y :r están utilizando marcadores de posición para los nombres y valores de los atributos. Puede ver más información sobre los que se encuentran en la documentación Uso de marcadores de posición para nombres y valores de atributos .

Me gustaría ver las expresiones de actualización: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html#Expressions.Modifying.UpdateExpressions.ADD

Debería ser factible con un ADD, aunque no estoy seguro de cuál es el soporte en boto para esto.