T3J*_*J45 3 python amazon-dynamodb boto3 aws-lambda dynamodb-queries
我正在尝试逐项查看表,这样如果某个项目已经存在,那么我应该能够更新它,如果不存在,那么我应该能够插入它。
但是,我了解到更新的工作方式也类似于 upsert(update/insert) 。我的情况也不适合这个。
item表中是否存在并存储flag(布尔值)flag为0(项目不可用),然后插入该项目并将当前时间戳添加到列中Inserted_dttmflag为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
Run Code Online (Sandbox Code Playgroud)
DynamoDB 具有条件表达式的概念 ( https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html ),您可以使用它来确定是否要更新插入或插入。
然而不幸的是,它不具备根据条件结果动态更改插入/更新的能力。即,您可以强制Updated_dttm仅在更新时设置,并且Inserted_dttm仅在插入时设置,但不能在单个操作中同时执行这两项操作。
但是,您可以分两步执行此操作(目前我假设更新比插入更常见,但如果情况并非如此,您可以反转逻辑):
Updated_dttm尝试用条件更新(设置)attribute_exists(PARTITION_KEY_NAME)ConditionalCheckFailedException则假设插入 (set Inserted_dttm)注意,如果您有分区和排序键,则需要使用条件attribute_exists(PARTITION_KEY_NAME) and attribute_exists(SORT_KEY_NAME)
| 归档时间: |
|
| 查看次数: |
5526 次 |
| 最近记录: |