Как удалить вложенный атрибут JSON в dynamodb / python

#python #amazon-web-services #amazon-dynamodb #boto3 #dynamodb-queries

Вопрос:

У меня есть простая база данных dynamodb, которая использует «Лигу» в качестве ключа раздела и «Команду» в качестве ключа сортировки для хранения всех данных реестра в поле атрибута «Игроки», использующем формат JSON. Я хотел бы получить доступ и удалить определенного игрока (в данном случае Ларри Берда или Джейсона Татума), однако у меня возникают проблемы с правильным доступом к схеме для удаления определенного ключа и значений, особенно с учетом того, что игроки.Джейсон Татум не сработает, потому что это два разных слова. Вот базовый скелетный код для функции на данный момент:

 def lambda_handler(event, context):

    newLeague = None
    newTeam = None
    newPlayer = None
    statusCode = 200

    if checkKey(event, 'League'):
        newLeague = event['League']
    
    if checkKey(event, 'Team'):
        newTeam = event['Team']
    
    if checkKey(event, 'Player'):
        newPlayer = event['Player']

    if newLeague != None and newTeam != None and newPlayer != None:
        retrievedData = table.delete_item(
           Key = {
               'League': newLeague,
               'Team': newTeam,
           }
        )
 

Макет базы данных в Dynamodb для справки

Макет базы данных в Dynamodb для справки

Ответ №1:

Удаление вложенного элемента в DynamoDB можно выполнить с помощью REMOVE выражения-в update_item -методе:

 client.update_item(
    TableName=table_name,
    Key={"League": {"S": "NBA"}, "Team": {"S": "Celtics"}},
    UpdateExpression="REMOVE Players.#p",
    ExpressionAttributeNames={"#p": "Larry Bird"},
)
 

Обратите ExpressionAttributeNames внимание на то , чтобы обойти тот факт, что в имени игрока есть пробел.

Добавление игрока выполняется аналогичным образом:

 client.update_item(
    TableName=table_name,
    Key={"League": {"S": "NBA"}, "Team": {"S": "Celtics"}},
    UpdateExpression="SET Players.#p = :v",
    ExpressionAttributeNames={"#p": "Larry Bird"},
    ExpressionAttributeValues={":v": {"M": {..}}}
)
 

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

1. Спасибо за вашу помощь, ваше решение, похоже, работает правильно. И последний вопрос: вместо удаления игрока в json, как я мог бы вместо этого добавить нового игрока? Насколько я понимаю, я мог бы сделать что-то в этом роде UpdateExpression = "SET Players = list_append(Players, #p)" , но это не совсем работает

2. @EliM Я обновил свой ответ. Приведенный пример взят из памяти, но должен быть правильным.