根据 table dynamodb python 中的存在更新或插入项目
update or insert item based on existence in table dynamodb python
问题
我正在尝试逐项查看 table,这样如果某个项目已经存在,那么我应该能够更新它,如果不存在,那么我应该能够插入它。
但是,我了解到更新也像 upsert(update/insert) 一样工作。我的情况也不适合。
我的案例
- 检查
item
是否存在于 table 中并存储 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
DynamoDB 具有条件表达式 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html) 的概念,您可以使用它来识别是更新插入还是插入。
不幸的是,它无法根据条件的结果动态更改 insert/update。也就是说,您可以强制 Updated_dttm
仅在更新时设置,而 Inserted_dttm
仅在插入时设置,但您不能在一次操作中同时执行这两项操作。
但是,您可以分两步执行此操作(现在我假设更新比插入更常见,但如果不是这样,您可以反转逻辑):
- 尝试更新(设置
Updated_dttm
)条件attribute_exists(PARTITION_KEY_NAME)
- 如果
ConditionalCheckFailedException
失败,则假设插入 (set Inserted_dttm
)
n.b。如果您有分区和排序键,则需要使用条件 attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)
问题
我正在尝试逐项查看 table,这样如果某个项目已经存在,那么我应该能够更新它,如果不存在,那么我应该能够插入它。
但是,我了解到更新也像 upsert(update/insert) 一样工作。我的情况也不适合。
我的案例
- 检查
item
是否存在于 table 中并存储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
DynamoDB 具有条件表达式 (https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html) 的概念,您可以使用它来识别是更新插入还是插入。
不幸的是,它无法根据条件的结果动态更改 insert/update。也就是说,您可以强制 Updated_dttm
仅在更新时设置,而 Inserted_dttm
仅在插入时设置,但您不能在一次操作中同时执行这两项操作。
但是,您可以分两步执行此操作(现在我假设更新比插入更常见,但如果不是这样,您可以反转逻辑):
- 尝试更新(设置
Updated_dttm
)条件attribute_exists(PARTITION_KEY_NAME)
- 如果
ConditionalCheckFailedException
失败,则假设插入 (setInserted_dttm
)
n.b。如果您有分区和排序键,则需要使用条件 attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)