DynamoDB: альтернатива list_append для наборов

#amazon-dynamodb

#amazon-dynamodb

Вопрос:

Я пытаюсь выполнить операцию обновления для атрибута набора строк dynamodb. Для списков операция будет выглядеть следующим образом

 set #key = list_append(if_not_exists(#key, :empty_list), :newValue)
 

Но это создает атрибут списка. Есть ли альтернатива для list_append, кроме как для наборов?

Ответ №1:

Поскольку DynamoDB не может хранить пустые наборы, это на самом деле довольно просто, вы можете просто использовать ADD оператор.

Вот пример, который я построил на Python:

 import boto3

TABLE_NAME = "set-demo"


def create_table():
    ddb = boto3.client("dynamodb")
    ddb.create_table(
        AttributeDefinitions=[
            {"AttributeName": "PK", "AttributeType": "S"},
            {"AttributeName": "SK", "AttributeType": "S"}
        ],
        TableName=TABLE_NAME,
        KeySchema=[
            {"AttributeName": "PK", "KeyType": "HASH"},
            {"AttributeName": "SK", "KeyType": "RANGE"}
        ],
        BillingMode="PAY_PER_REQUEST"
    )

def add_to_set(item_id: str, value: str):
    table = boto3.resource("dynamodb").Table(TABLE_NAME)

    table.update_item(
        Key={
            "PK": f"ITEM#{item_id}",
            "SK": f"METADATA",
        },
        UpdateExpression="ADD #set_name :set_value",
        ExpressionAttributeNames={
            "#set_name": "values"
        },
        ExpressionAttributeValues={
            ":set_value": {value},  # needs to be a set type
        }
    )

if __name__ == "__main__":
    # create_table()
    add_to_set("a", "value_1")
    add_to_set("a", "value_2")
    add_to_set("a", "value_1")

 

В python достаточно передать значение с типом данных, установленным в ExpressionAttributeValues for boto3, чтобы знать, что оно должно преобразовать его в набор под капотом.

Когда я вызываю add_to_set в первый раз, он создаст атрибут set, а последующие вызовы — это просто обновления атрибута.

Вот как выглядит элемент в конце:

 {
  "PK": {
    "S": "ITEM#a"
  },
  "SK": {
    "S": "METADATA"
  },
  "values": {
    "SS": [
      "value_1",
      "value_2"
    ]
  }
}
 

Комментарии:

1. Это решило вашу проблему? Пожалуйста, подумайте о том, чтобы принять ответ, чтобы будущие читатели знали, что это решение помогло вам.