使用 Python SDK 为行写入、更新或删除操作设置判断条件,仅在目标行满足条件时执行操作。
前提条件
安装Tablestore Python SDK并初始化客户端。
功能说明
通过 Condition 设置行存在性条件和属性列值条件,并将其传入 put_row、update_row、delete_row 或相应的批量行操作。条件不满足时,服务端返回错误,行数据不被修改。
Condition(row_existence_expectation, column_condition=None)
以下示例仅在目标行存在时更新 status 属性列。
primary_key = [("partition", "device"), ("id", 1)]
row = Row(primary_key, {"PUT": [("status", "online")]})
condition = Condition(RowExistenceExpectation.EXPECT_EXIST)
consumed, return_row = client.update_row(
"example_table",
row,
condition,
)
参数说明
更新条件
Condition 包含以下参数。
|
名称 |
类型 |
说明 |
|
row_existence_expectation(必选) |
|
行存在性条件。 |
|
column_condition(可选) |
|
属性列值条件。支持 |
单列值条件
调用 SingleColumnCondition(column_name, column_value, comparator, pass_if_missing=True, latest_version_only=True) 创建单列值条件。
|
名称 |
类型 |
说明 |
|
column_name(必选) |
|
待判断的属性列名称。 |
|
column_value(必选) |
|
用于比较的目标值。类型必须与属性列值一致。 |
|
comparator(必选) |
|
比较运算符。取值为 |
|
pass_if_missing(可选) |
|
行中不存在目标属性列时是否满足条件,默认值为 |
|
latest_version_only(可选) |
|
是否只判断属性列的最新版本,默认值为 |
单列正则条件
调用 SingleColumnRegexCondition(column_name, comparator, column_value=None, regex_rule=None, latest_version_only=True) 创建单列正则条件。只有字符串类型的属性列支持正则条件。
|
名称 |
类型 |
说明 |
|
column_name(必选) |
|
待判断的字符串属性列名称。 |
|
comparator(必选) |
|
比较运算符。取值为 |
|
column_value(可选) |
|
用于比较的目标值。 |
|
regex_rule(可选) |
|
正则提取和类型转换规则。不设置时直接比较属性列值。 |
|
latest_version_only(可选) |
|
是否只判断属性列的最新版本,默认值为 |
行中不存在目标属性列时,单列正则条件始终不满足,无法单独配置 pass_if_missing。
正则规则
regex_rule 的类型为 RegexRule,包含以下参数。
|
名称 |
类型 |
说明 |
|
regex_input(必选) |
|
正则表达式,长度不超过 256 字节。支持 Perl 正则和单字节字符,不支持匹配中文。包含捕获分组时提取第一个分组;不包含分组时提取整个匹配结果。 |
|
cast_type(必选) |
|
提取结果的转换类型。取值为 |
组合列值条件
调用 CompositeColumnCondition(combinator) 创建组合列值条件,再调用 add_sub_condition 添加子条件。
|
名称 |
类型 |
说明 |
|
combinator(必选) |
|
逻辑运算符。取值为 |
|
sub_conditions(必选) |
|
参与逻辑运算的子条件。支持单列值条件、单列正则条件和嵌套的组合条件,最多组合 32 个条件。 |
场景示例
单列值条件
以下示例仅在目标行存在且 status 属性列的最新值为 pending 时更新数据。目标列不存在时不满足条件。
column_condition = SingleColumnCondition(
"status",
"pending",
ComparatorType.EQUAL,
pass_if_missing=False,
)
condition = Condition(
RowExistenceExpectation.EXPECT_EXIST,
column_condition,
)
client.update_row("example_table", row, condition)
组合列值条件
以下示例构造 (status == "pending" AND revision == 1) OR priority > 5 条件。
status_and_revision = CompositeColumnCondition(LogicalOperator.AND)
status_and_revision.add_sub_condition(
SingleColumnCondition("status", "pending", ComparatorType.EQUAL)
)
status_and_revision.add_sub_condition(
SingleColumnCondition("revision", 1, ComparatorType.EQUAL)
)
column_condition = CompositeColumnCondition(LogicalOperator.OR)
column_condition.add_sub_condition(status_and_revision)
column_condition.add_sub_condition(
SingleColumnCondition("priority", 5, ComparatorType.GREATER_THAN)
)
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, column_condition)
乐观锁 CAS
以下示例先读取 revision 的当前值,再以该值作为更新条件。只有数据未被其他请求修改时,版本号才加 1。
primary_key = [("partition", "device"), ("id", 1)]
consumed, current_row, next_token = client.get_row(
"example_table",
primary_key,
columns_to_get=["revision"],
)
old_revision = current_row.attribute_columns[0][1]
row = Row(primary_key, {"PUT": [("revision", old_revision + 1)]})
column_condition = SingleColumnCondition(
"revision",
old_revision,
ComparatorType.EQUAL,
pass_if_missing=False,
latest_version_only=True,
)
condition = Condition(RowExistenceExpectation.EXPECT_EXIST, column_condition)
client.update_row("example_table", row, condition)