我正在尝试逐项查看表,以便如果某项已经存在,那么我应该能够对其进行更新,否则,我应该能够将其插入。
但是,我了解到更新也像upsert(update / insert)一样工作。我的情况也不适合。
item
并存储flag
(布尔值)flag
是否为0
(项目不可用),然后插入项目并将当前时间戳记添加到列Inserted_dttm
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
答案 0 :(得分:2)
DynamoDB具有条件表达式(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html)的概念,您可以使用它来确定是要插入还是插入。
但是,不幸的是,它不具备根据条件结果动态更改插入/更新的功能。也就是说,您可以强制Updated_dttm
仅在更新中设置,而Inserted_dttm
仅在插入项上设置,但是您不能在一个操作中同时执行这两项操作。
但是,您可以分两步执行此操作(目前,我假设更新比插入操作更常见,但是如果不正确,则可以反转逻辑):
Updated_dttm
更新(设置attribute_exists(PARTITION_KEY_NAME)
)ConditionalCheckFailedException
,则假定插入(设置Inserted_dttm
) n.b。如果您有分区和排序键,则需要使用条件attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)