Невозможно удалить элемент из DynamoDB StringSet с помощью boto3 - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть таблица, которая содержит атрибут типа StringSet.Имя атрибута allDevices.Я пытаюсь удалить идентификатор устройства из StringSet.Однако когда я запускаю приведенный ниже код, он не удаляет строку из StringSet.Это также не выдает никакой ошибки.При попытке удалить ID устройства fakeID1 ответ будет:

{'Attributes': {'allDevices': {'fakeID1', 'fakeID2'}}, 'ResponseMetadata': {'RequestId': '<removed>', 'HTTPStatusCode': 200, 'HTTPHeaders': {'server': 'Server', 'date': 'Fri, 22 Feb 2019 09:04:52 GMT', 'content-type': 'application/x-amz-json-1.0', 'content-length': '93', 'connection': 'keep-alive', 'x-amzn-requestid': '<removed>', 'x-amz-crc32': '<removed>'}, 'RetryAttempts': 0}}

Как получить DynamoDB для удаления строки из StringSet?

Код Python:

dynamodb = boto3.resource('dynamodb', region_name='us-east-1')
table = dynamodb.Table('sniffer-users')
try:
    response = table.update_item(
        Key={
            'username': user,
        },
        UpdateExpression="DELETE allDevices :s",
        ExpressionAttributeValues={
            ':s': set(deviceID),
        },
        ReturnValues="UPDATED_NEW"
    )
    print(response)
except ClientError as e:
    print(e.response['Error']['Message'])
    return -9

Вещи, которые я пробовал:

  • Удаление set() со всего идентификатора устройства
  • Изменить DELETE на REMOVE
  • Стучу головой о стену, умоляю и умоляю
  • Явно устанавливаю fakeID1, чтобы он читал ':s': set('fakeID1'),
  • Используя синтаксис ':s': {'SS': [oldDeviceID]},
  • Четырехкратная проверка того, что allDevices совпадает с кодом в DDB
  • Добавление чего-либо к allDevices - это работает безупречно
  • Изменение времени выполнения с Python 3.7 на Python 2.7

1 Ответ

0 голосов
/ 03 июля 2019

Вам просто нужно внести незначительные изменения в ваши ExpressionAttributeValues.Чтобы преобразовать одну строку в набор, вы должны сначала сделать ее списком.

ExpressionAttributeValues={
    ':s': set([deviceID]),
}

Обратите внимание на разницу ниже между размещением вашей переменной внутри [], чтобы сделать ее списком, и не делать этого.

>>> deviceID = "WB529"
>>> set(deviceID)
set(['9', '2', 'B', '5', 'W'])
>>> set([deviceID])
set(['WB529'])

Эта операция удаления покажет, что она прошла успешно, и вернет «обновленные» атрибуты, даже если никаких изменений не было сделано.У меня есть действительно похожий код;из ответа невозможно определить, удалили ли вы элемент из набора строк или его никогда не было в начале.

Я не пробовал, но я полагаю, что добавление ConditionExpression даст вамобратная связь (операция будет выполнена успешно или выдаст исключение).

...