使用DynamoDB和Boto3进行乐观锁定的Upsert

时间:2019-09-16 15:14:00

标签: amazon-dynamodb boto3

我正在尝试使用乐观锁定将某个项目的upsert实施到DynamoDB中。我的更新部分与ConditionExpression一起使用以检查版本。但这会使保存部分失败,因为ConditionExpression对于保存是错误的。是否可以编写ConditionExpression以便处理两种情况?

我的代码:

result = copy.copy(user)
table = get_db_table()

current_version = result.get_version()
result.update_version()

try:
    table.put_item(
        Item=result.to_table_item(),
        ConditionExpression=Attr(result.get_version_key()).eq(current_version)
    )
except ClientError as error:
    logger.error(
        "Saving to db failed with '%s'",
        str(error))
    # Restore version
    result.set_version(current_version)
    raise Exception(ErrorCode.DB_SAVE) from error
return result

1 个答案:

答案 0 :(得分:1)

基本上,您需要先确定该属性存在,然后才能对其进行比较。您的条件表达式字符串应为

does_not_exist(current_version) or current_version = expected_current_version

使用Boto3,您可以使用以下方法创建

Attr(result.get_version_key()).not_exists() | Attr(result.get_version_key().eq(current_version))