#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 для справки
Ответ №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 Я обновил свой ответ. Приведенный пример взят из памяти, но должен быть правильным.