単一行の挿入
PutRow は、システム生成のバージョン番号、カスタムバージョン番号、および条件付き書き込みをサポートしています。
システム生成のバージョン番号
10 個の属性列を持つ行を挿入し、それぞれが 1 つのバージョンのデータを格納します。システムはバージョン番号を自動的に生成します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 属性列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
client.putRow(new PutRowRequest(rowPutChange));
}
カスタムバージョン番号
10 個の属性列を持つ行を挿入し、それぞれがカスタムバージョン番号を持つ 3 つのバージョンのデータを格納します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 属性列を追加します。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
行の存在条件
指定された行が存在しない場合にのみ、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 指定された行が存在しないことを期待する行の存在条件を指定します。
rowPutChange.setCondition(new Condition(RowExistenceExpectation.EXPECT_NOT_EXIST));
// 属性列を追加します。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
行の存在条件と列の値の条件
行が存在し、Col0 の値が 100 より大きい場合に、10 個の属性列 (各 3 バージョン) を持つ行を挿入します。
private static void putRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowPutChange rowPutChange = new RowPutChange("<TABLE_NAME>", primaryKey);
// 指定された行が存在し、Col0 列の値が 100 より大きいことを期待する行の存在条件と列ベースの条件を指定します。
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowPutChange.setCondition(condition);
// 属性列を追加します。
long ts = System.currentTimeMillis();
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 3; j++) {
rowPutChange.addColumn(new Column("Col" + i, ColumnValue.fromLong(j), ts + j));
}
}
client.putRow(new PutRowRequest(rowPutChange));
}
単一行の更新
UpdateRow は、無条件の更新と、行の存在および列の値に基づく条件付き更新をサポートしています。
条件なしの更新
複数の列を更新し、列から特定のバージョンのデータを削除し、列を削除します。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
// 列を更新します。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列から特定のバージョンのデータを削除します。
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
// 列を削除します。
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
行の存在条件と列の値の条件
行が存在し、Col0 の値が 100 より大きい場合に、行を更新します。
private static void updateRow(SyncClient client, String pkValue) {
// プライマリキーを構築します。
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME, PrimaryKeyValue.fromString(pkValue));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// テーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", primaryKey);
// 指定された行が存在し、Col0 列の値が 100 より大きいことを期待する行の存在条件と列ベースの条件を指定します。
Condition condition = new Condition(RowExistenceExpectation.EXPECT_EXIST);
condition.setColumnCondition(new SingleColumnValueCondition("Col0",
SingleColumnValueCondition.CompareOperator.GREATER_THAN, ColumnValue.fromLong(100)));
rowUpdateChange.setCondition(condition);
// 列を更新します。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列から特定のバージョンのデータを削除します。
rowUpdateChange.deleteColumn("Col10", 1465373223000L);
// 列を削除します。
rowUpdateChange.deleteColumns("Col11");
client.updateRow(new UpdateRowRequest(rowUpdateChange));
}
複数行を一度に書き込む
次の例では、2 つの PutRow 操作、1 つの UpdateRow 操作、および 1 つの DeleteRow 操作を含む BatchWriteRow リクエストを送信します。
private static void batchWriteRow(SyncClient client) {
BatchWriteRowRequest batchWriteRowRequest = new BatchWriteRowRequest();
// rowPutChange1 を構築します。
PrimaryKeyBuilder pk1Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk1Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk1"));
// データテーブルの名前を指定します。
RowPutChange rowPutChange1 = new RowPutChange("<TABLE_NAME>", pk1Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange1.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチ操作のコードに rowPutChange1 を追加します。
batchWriteRowRequest.addRowChange(rowPutChange1);
// rowPutChange2 を構築します。
PrimaryKeyBuilder pk2Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk2Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk2"));
// データテーブルの名前を指定します。
RowPutChange rowPutChange2 = new RowPutChange("<TABLE_NAME>", pk2Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowPutChange2.addColumn(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// バッチ操作のコードに rowPutChange2 を追加します。
batchWriteRowRequest.addRowChange(rowPutChange2);
// rowUpdateChange を構築します。
PrimaryKeyBuilder pk3Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk3Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk3"));
// データテーブルの名前を指定します。
RowUpdateChange rowUpdateChange = new RowUpdateChange("<TABLE_NAME>", pk3Builder.build());
// 列を追加します。
for (int i = 0; i < 10; i++) {
rowUpdateChange.put(new Column("Col" + i, ColumnValue.fromLong(i)));
}
// 列を削除します。
rowUpdateChange.deleteColumns("Col10");
// バッチ操作のコードに rowUpdateChange を追加します。
batchWriteRowRequest.addRowChange(rowUpdateChange);
// rowDeleteChange を構築します。
PrimaryKeyBuilder pk4Builder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
pk4Builder.addPrimaryKeyColumn("pk", PrimaryKeyValue.fromString("pk4"));
// データテーブルの名前を指定します。
RowDeleteChange rowDeleteChange = new RowDeleteChange("<TABLE_NAME>", pk4Builder.build());
// バッチ操作のコードに rowDeleteChange を追加します。
batchWriteRowRequest.addRowChange(rowDeleteChange);
BatchWriteRowResponse response = client.batchWriteRow(batchWriteRowRequest);
System.out.println("すべての操作が成功したかどうか:" + response.isAllSucceed());
if (!response.isAllSucceed()) {
for (BatchWriteRowResponse.RowResult rowResult : response.getFailedRows()) {
System.out.println("失敗した行:" + batchWriteRowRequest.getRowChange(rowResult.getTableName(), rowResult.getIndex()).getPrimaryKey());
System.out.println("失敗の原因:" + rowResult.getError());
}
/**
* createRequestForRetry メソッドを使用して、失敗した行の操作を再試行するための別のリクエストを構築できます。ここでは再試行リクエストのみが構築されます。
* 再試行方法として、Tablestore SDK のカスタム再試行ポリシーを使用することを推奨します。この機能により、バッチ操作後に失敗した行を再試行できます。再試行ポリシーを設定すると、操作を呼び出すための再試行コードを追加する必要がありません。
*/
BatchWriteRowRequest retryRequest = batchWriteRowRequest.createRequestForRetry(response.getFailedRows());
}
}