#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. Это решило вашу проблему? Пожалуйста, подумайте о том, чтобы принять ответ, чтобы будущие читатели знали, что это решение помогло вам.