обновить или вставить элемент в зависимости от наличия в таблице DynamodB Python - PullRequest
0 голосов
/ 19 октября 2018

Проблема

Я пытаюсь просмотреть таблицу за элементом, поэтому, если элемент уже существует, я смогу обновить его, если нет, то смогу вставить его.

Однако я узнал, что обновление также работает как upsert (update / insert).Мой случай тоже не подходит.

Мой случай

  1. Проверьте, существует ли в таблице item, и сохраните flag (логическое значение)
  2. Проверьте, является ли flag значение 0, (элемент недоступен), затем вставьте элемент и добавьте текущую метку времени в столбец Inserted_dttm
  3. Проверьте, если flag равно 1, (элемент доступен), тообновите элемент и добавьте текущую метку времени в столбец Updated_dttm (а не Inserted_dttm)

Пробная версия

Я искал query() - хороший вариант для get_item(), однако ваши решения приветствуются с любым из них.

def lambda_handler(event, context):
    x = TrainDataProcess()
    file_name = 'Training_data/' + event['file_name']
    s3.Object(bucket_name, file_name).download_file('/tmp/temp.xlsx')
    table_name = 'training_data'

    x.load_excel(name='/tmp/temp.xlsx')
    x.load_headers(skiprows=0)
    x.data_picking()

    table = dynamoDB_client.Table(table_name)
    load = x.return_records_json()

    try:
        with table.batch_writer() as batch:
            for record in load:
                flag = table.query(TableName=table_name, )
                if flag == 0:
                    record['inserted_dttm'] = get_dttm()
                    batch.put_item(Item=record)
                elif flag == 1:
                    record['updated_dttm'] = get_dttm()
                    batch.update_item(Item=record)
            return True
    except Exception as e:
        return e

1 Ответ

0 голосов
/ 19 октября 2018

DynamoDB имеет концепцию условных выражений (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html), которую вы можете использовать, чтобы определить, выполняете ли вы вставку или вставку.

К сожалению, однако, он не имеет возможности динамически изменятьвставка / обновление в зависимости от результата условия, т. е. вы можете принудительно установить, что Updated_dttm задано только для обновления, а Inserted_dttm - только для вставки, но вы не можете выполнить оба действия в одной операции.

Однако вы можете сделать это в два этапа (сейчас я буду считать, что обновления более распространены, чем вставки, но вы можете изменить логику, если это не так):

  1. Попытайтесь обновить (установить Updated_dttm) с условием attribute_exists(PARTITION_KEY_NAME)
  2. Если это не удастся с ConditionalCheckFailedException, тогда предположите вставку (установите Inserted_dttm)

nb, если у вас естьключ раздела и сортировки, вам нужно использовать условие attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)

...