使用 DynamoDB 和 Boto3 使用乐观锁定进行更新插入

sno*_*uis 1 amazon-dynamodb boto3

我正在尝试使用乐观锁定将项目更新插入到 DynamoDB 中。我有更新部分与 a 一起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
Run Code Online (Sandbox Code Playgroud)

Mat*_*ope 5

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

does_not_exist(current_version) or current_version = expected_current_version
Run Code Online (Sandbox Code Playgroud)

使用 Boto3,您可以使用以下命令创建它

Attr(result.get_version_key()).not_exists() | Attr(result.get_version_key().eq(current_version))
Run Code Online (Sandbox Code Playgroud)