2

问题

我正在尝试逐项查看表格,以便如果一个项目已经存在,那么我应该能够更新它,如果没有,那么我应该能够插入它。

但是,我了解到更新也可以像 upsert(update/insert) 一样工作。我的情况也不适合。

我的情况

  1. 检查item表中是否存在并存储flag(布尔值)
  2. 检查是否flag0,(项目不可用)然后,插入项目并将当前时间戳添加到列中Inserted_dttm
  3. 检查是否flag1,(项目可用)然后更新项目并将当前时间戳添加到列中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
4

1 回答 1

5

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则假设插入 (set Inserted_dttm)

注意,如果您有分区和排序键,则需要使用条件attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)

于 2018-10-19T09:56:25.040 回答