Tablestore の Python SDK を使用して、単一のリクエストで複数の Tablestore テーブルに対して、データの挿入 (Put)、更新 (Update)、削除 (Delete) といったバッチ書き込み操作を実行します。
注意事項
-
リクエスト内のいずれかの操作にパラメーターの誤りがある場合、サーバーは例外をスローし、すべての操作が実行されません。
-
単一のバッチ書き込みリクエストでは、最大 200 行をサポートしており、全行の合計データサイズは 4 MB を超えてはなりません。
-
単一のリクエスト内で同一テーブルに対して add メソッドを複数回呼び出した場合、最後の呼び出しのみが有効になります。
前提条件
メソッド
def batch_write_row(self, request)
サンプルコード
以下のサンプルコードでは、バッチ書き込み操作を使用して test_table テーブルに 1 行を挿入します。
try:
# リクエストを構築します。
request = BatchWriteRowRequest()
put_row_items = []
# PutRowItem を構築します。
put_pk = [('id', 'row1')]
put_columns = []
put_row = Row(put_pk, put_columns)
# 書き込み操作には必ず条件を指定する必要があります。「RowExistenceExpectation.IGNORE」は、行の存在チェックを行わないことを意味します。
put_row_item = PutRowItem(put_row, Condition(RowExistenceExpectation.IGNORE))
put_row_items.append(put_row_item)
request.add(TableInBatchWriteRowItem('test_table', put_row_items))
# batch_write_row メソッドを呼び出してバッチ操作を実行します。
response = client.batch_write_row(request)
# 応答を処理します。
# 挿入 (Put) 行
for table_name,put_rows in response.table_of_put.items():
for item in put_rows:
if not item.is_ok:
print('テーブル名: %s。行の挿入に失敗しました。エラーメッセージ: %s' % (table_name, item.error_message))
# 更新 (Update) 行
for table_name, update_rows in response.table_of_update.items():
for item in update_rows:
if not item.is_ok:
print('テーブル名: %s。行の更新に失敗しました。エラーメッセージ: %s。' % (table_name, item.error_message))
# 削除 (Delete) 行
for table_name, delete_rows in response.table_of_delete.items():
for item in delete_rows:
if not item.is_ok:
print('テーブル名: %s。行の削除に失敗しました。エラーメッセージ: %s' % (table_name, item.error_message))
except Exception as e:
print('バッチ書き込み操作に失敗しました。エラー: %s' % e)
以下の例では、さまざまな種類のデータ操作を示します。
-
PutRowItem: 行データの挿入
put_row_items = [] # PutRowItem を構築します。 put_pk = [('id', 'row1')] put_columns = [] put_row = Row(put_pk, put_columns) # 書き込み操作には必ず条件を指定する必要があります。「RowExistenceExpectation.IGNORE」は、行の存在チェックを行わないことを意味します。 put_row_item = PutRowItem(put_row, Condition(RowExistenceExpectation.IGNORE)) put_row_items.append(put_row_item) request.add(TableInBatchWriteRowItem('test_table', put_row_items))行データを挿入する際に属性列を追加します。
# 属性列 put_columns = [('col1','val1')] # カスタムタイムスタンプ付きの属性列 put_columns = [('col1','val1', int(time.time() * 1000))] -
UpdateRowItem: 行データの更新。この項目を使用すると、属性列の値を変更したり、属性列を追加したり、特定の属性列バージョンを削除したり、属性列全体を削除したりできます。
update_row_items = [] # UpdateRowItem を構築します。 update_pk = [('id', 'row1')] update_columns = { 'PUT': [('col1', 'changed_val1')] } update_row = Row(update_pk, update_columns) # 更新操作には必ず条件を指定する必要があります。「RowExistenceExpectation.IGNORE」は、行の存在チェックを行わないことを意味します。 update_row_item = UpdateRowItem(update_row, Condition(RowExistenceExpectation.IGNORE)) update_row_items.append(update_row_item) request.add(TableInBatchWriteRowItem('test_table', update_row_items))行データを更新する際に属性列を追加または削除します。
# 属性列の追加 update_columns = { 'PUT': [('col3', 'val3')] } # カスタムタイムスタンプ付きの属性列の追加 update_columns = { 'PUT': [('col4', 'val4', int(time.time() * 1000))] } # 属性列の削除 update_columns = { 'DELETE_ALL': ['col2'] } -
DeleteRowItem: 行データの削除
delete_row_items = [] # DeleteRowItem を構築します。 delete_pk = [('id', 'row1')] delete_row = Row(delete_pk, []) # 削除操作には必ず条件を指定する必要があります。「RowExistenceExpectation.IGNORE」は、行の存在チェックを行わないことを意味します。 delete_row_item = DeleteRowItem(delete_row, Condition(RowExistenceExpectation.IGNORE)) delete_row_items.append(delete_row_item) request.add(TableInBatchWriteRowItem('test_table', delete_row_items)) -
単一テーブルに対する複数の操作の実行例
request = BatchWriteRowRequest() table_batch_items = TableInBatchWriteRowItem('<TABLE_NAME>', put_row_items) table_batch_items.row_items += delete_row_items request.add(table_batch_items)