Как условно вставить элемент в таблицу dynamodb с помощью boto3

Если у меня есть таблица с хэш-ключом userId и ключ диапазона productId, как я могу поместить элемент в эту таблицу только в том случае, если он еще не существует с использованием привязок boto3 dynamodb?

Обычный вызов put_item выглядит следующим образом:

table.put_item(Item={'userId': 1, 'productId': 2}) 

Мой вызов с выражением ConditionExpression выглядит так:

 table.put_item( Item={'userId': 1, 'productId': 2}, ConditionExpression='userId <> :uid AND productId <> :pid', ExpressionAttributeValues={':uid': 1, ':pid': 3} ) 

Но каждый раз возникает исключение ConditionalCheckFailedException. Существует ли элемент с одним и тем же продуктом или нет.

2 Solutions collect form web for “Как условно вставить элемент в таблицу dynamodb с помощью boto3”

Документация для этого, к сожалению, не очень понятна. Мне нужно было сделать что-то подобное, и вот что сработало для меня, используя boto3:

 try: table.put_item( Item={ 'foo':1, 'bar':2, }, ConditionExpression='attribute_not_exists(foo) AND attribute_not_exists(bar)' ) except botocore.exceptions.ClientError as e: # Ignore the ConditionalCheckFailedException, bubble up # other exceptions. if e.response['Error']['Code'] != 'ConditionalCheckFailedException': raise 

Подобно другому ответу, ключ находится в функции attribute_not_exists, но сначала мне было непонятно, как заставить это работать. После некоторых экспериментов я смог добиться этого.

Я думаю, что вы получите лучшую документацию, используя client.put_item, а не table.put_item

из документации boto3:

Чтобы предотвратить замену нового элемента на существующий элемент, используйте условное выражение, содержащее функцию attribute_not_exists, с именем атрибута, используемого в качестве ключа раздела для таблицы. Поскольку каждая запись должна содержать этот атрибут, функция attribute_not_exists будет успешной только в том случае, если соответствующий элемент не существует.

ConditionExpression:

ConditionExpression (string) – условие, которое должно выполняться для успешного выполнения операции условного ввода.

Выражение может содержать любое из следующего:

Функции: attribute_exists | attribute_not_exists | attribute_type | содержит | begin_with | size Эти имена функций чувствительны к регистру.

Я использую параметр переопределения item.save() на item.save()

  • Чтение файла JSON из S3 с использованием Python boto3
  • Ошибка соединения python boto3 без видимой причины
  • «Приведенный ключевой элемент не соответствует ошибке схемы» при получении элемента из DynamoDB
  • реализация USER_SRP_AUTH с помощью python boto3 для AWS Cognito
  • Как обновить метаданные существующего объекта в AWS S3 с помощью python boto3?
  • Как получить размер коллекции boto3?
  • Ошибка кодирования AWS Boto3 BASE64 при вызове метода client.request_spot_instances
  • Не удалось установить boto3
  •  
    Interesting Posts for Van-Lav

    conda 'source deactivate' вызывает ошибку: слишком много аргументов

    как запустить скрипт python без ввода «python …»

    Панды: Назначенные задания

    строка в datetime с дробными секундами, в Google App Engine

    Автоматически находить оптимальное значение порога изображения из плотности графика гистограммы

    Графики не отображаются с помощью matplotlib plt.show ()

    Неправильная маркировка глагола в NLTK

    сельдерей застрял в миксе: поиск соседей, не доходит до состояния готовности

    Кто-нибудь придумал продолжение строки исправления (стиль Python) в Sublime Text 2?

    Почему printf () дает странный вывод в python?

    Удаление файлов, начинающихся с имени Python

    Как получить монотонные длительности времени в python?

    Создание pandas timeseries с месяцем, но не годом

    Как проверить вызов .__ getitem __ () в списке Mock mock_calls во время модульного тестирования

    Как я могу показать модальный диалог PyQt и получить данные из своих элементов управления после его закрытия?

    Python - лучший язык программирования в мире.