Go 向け Tablestore SDK を使用して、行の書き込み、更新、または削除に対する条件を指定できます。これにより、ターゲット行が条件を満たす場合にのみ、操作が実行されます。
前提条件
Go 向け Tablestore SDK をインストールし、クライアントを初期化します。
説明
条件付き更新には、行の存在条件、列条件、またはその両方を含めることができます。 PutRowChange、UpdateRowChange、または DeleteRowChange で SetCondition と SetColumnCondition を呼び出します。 これらの行変更オブジェクトを BatchWriteRow リクエストに追加することもできます。 条件が満たされない場合、サーバーはエラーを返し、データは変更されません。
行の存在条件は、ターゲット行が存在するかどうかをチェックします。 「行の存在を無視する」、「行が存在することを必須とする」、または「行が存在しないことを必須とする」のいずれかを指定できます。
列条件では、1 つの列の値を比較するか、または論理演算子を使用して複数の列条件を組み合わせます。単一列条件は、プライマリキー列を参照することもできます。列同士の比較および定数同士の比較はサポートされていません。 1 回の更新に含められる列条件は最大 10 個です。
次のサンプルは、ターゲット行が存在し、かつ score 列の値が 30 である場合にのみ、status 列を更新します。
primaryKey := &tablestore.PrimaryKey{}
primaryKey.AddPrimaryKeyColumn("id", "row1")
change := &tablestore.UpdateRowChange{
TableName: "example_table",
PrimaryKey: primaryKey,
}
change.PutColumn("status", "processed")
change.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
change.SetColumnCondition(
tablestore.NewSingleColumnCondition("score", tablestore.CT_EQUAL, int64(30)),
)
_, err := client.UpdateRow(&tablestore.UpdateRowRequest{UpdateRowChange: change})
if err != nil {
log.Fatal(err)
}
パラメーター
行の存在条件
SetCondition を呼び出して RowExistenceExpectation の値を指定します。
|
名前 |
タイプ |
説明 |
|
expectation (必須) |
|
行の存在条件。有効な値は、行が存在するかどうかをチェックしない |
単一列条件
NewSingleColumnCondition(columnName, comparator, value) を呼び出して単一列の条件を作成します。SingleColumnCondition には、以下のパラメーターが含まれています。
|
名前 |
タイプ |
説明 |
|
ColumnName (必須) |
|
評価対象の列です。 この列には、属性列またはプライマリキー列を指定できます。 |
|
Comparator (必須) |
|
比較演算子。有効な値は |
|
ColumnValue (必須) |
|
比較対象となる定数値。 |
|
FilterIfMissing (任意) |
|
行に列が含まれていない場合に条件が満たされないかどうかを指定します。デフォルト値: |
|
LatestVersionOnly (任意) |
|
最新バージョンのみを評価するかどうかを指定します。デフォルト値は |
複合条件
NewCompositeColumnCondition(lo) を呼び出して複合条件を作成し、AddFilter を呼び出してサブ条件を追加します。サブ条件には、単一列条件またはネストされた複合条件を使用できます。CompositeColumnValueFilter には、次のパラメーターが含まれます。
|
名前 |
タイプ |
説明 |
|
Operator (必須) |
|
論理演算子です。 |
|
Filters (必須) |
|
組み合わせるサブ条件。 |
例
複合条件を使用したデータの更新
以下のサンプルは、score >= 60 かつ status が pending の場合にのみ更新を実行します。
condition := tablestore.NewCompositeColumnCondition(tablestore.LO_AND)
condition.AddFilter(
tablestore.NewSingleColumnCondition("score", tablestore.CT_GREATER_EQUAL, int64(60)),
)
condition.AddFilter(
tablestore.NewSingleColumnCondition("status", tablestore.CT_EQUAL, "pending"),
)
change.SetCondition(tablestore.RowExistenceExpectation_EXPECT_EXIST)
change.SetColumnCondition(condition)