Tablestore SDK for Python を使用して、行の put、update、または delete 操作に条件を追加し、ターゲット行が条件を満たす場合にのみ操作が実行されるようにします。
前提条件
Tablestore SDK for Python をインストールし、クライアントを初期化します。
機能の説明
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 互換の表現と 1 バイト文字に対応しています。 中国語の文字には対応していません。 式にキャプチャグループが含まれている場合、最初のグループを抽出します。 それ以外の場合は、一致全体を抽出します。 |
|
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 値を読み取り、それを更新条件として使用します。revision は、別のリクエストがデータを変更していない場合にのみインクリメントされます。
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)