Table Store SDK は、 BatchGetRow、BatchWriteRow および GetRange の複数行操作 API を提供します。
BatchGetRow
1 つ以上のテーブルから複数のデータ行をバッチで読み取ります。
BatchGetRow 操作は、基本的に複数の GetRow 操作のセットです。 各操作が実行され、結果が返され、容量ユニットが個別に消費されます。
多数の GetRow 操作の実行と比較して、BatchGetRow 操作はリクエストの応答時間を効率的に短縮し、データ読み取り速度を向上させます。
API
"""
説明: このオペレーションバッチは複数の行からデータを読み込みます。
request = BatchGetRowRequest()
request.add(TableInBatchGetRowItem(myTable0, primary_keys, column_to_get=None, column_filter=None))
request.add(TableInBatchGetRowItem(myTable1, primary_keys, column_to_get=None, column_filter=None))
request.add(TableInBatchGetRowItem(myTable2, primary_keys, column_to_get=None, column_filter=None))
request.add(TableInBatchGetRowItem(myTable3, primary_keys, column_to_get=None, column_filter=None))
response = client.batch_get_row(request)
response は tablestore.metadata.BatchGetRowResponse 型の返された結果を示します。
"""
def batch_get_row(self, request):
例
この例では、3 行のデータがバッチ読み取りされます。
# 返される列です。
columns_to_get = ['name', 'mobile', 'address', 'age']
# 3行読みます。
rows_to_get = []
for i in range(0, 3):
primary_key = [('gid',i), ('uid',i+1)]
rows_to_get.append(primary_key)
# フィルタ条件: 名前は "Johb"、住所は "China" です。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("name", "John", ComparatorType.EQUAL))
cond.add_sub_condition(SingleColumnCondition("address", 'China', ComparatorType.EQUAL))
# バッチ読み込み要求を作成します。
request = BatchGetRowRequest()
# テーブル追加: table_name の示すテーブルから読み込む行です。 最後のパラメーター "1" は最新バージョンの読み取りを示します。
request.add(TableInBatchGetRowItem(table_name, rows_to_get, columns_to_get, cond, 1))
# テーブル追加: notExistTable の示すテーブルから読み込む行。
request.add(TableInBatchGetRowItem('notExistTable', rows_to_get, columns_to_get, cond, 1))
try:
result = client.batch_get_row(request)
print ('Result status: %s'%(result.is_all_succeed()))
table_result_0 = result.get_result_by_table(table_name)
table_result_1 = result.get_result_by_table('notExistTable')
print ('Check first table\'s result:')
for item in table_result_0:
if item.is_ok:
print ('Read succeed, PrimaryKey: %s, Attributes: %s' % (item.row.primary_key, item.row.attribute_columns))
else:
print ('Read failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
print ('Check second table\'s result:')
for item in table_result_1:
if item.is_ok:
print ('Read succeed, PrimaryKey: %s, Attributes: %s' % (item.row.primary_key, item.row.attribute_columns))
else:
print ('Read failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
# The client is abnormal, which is typically due to incorrect parameters or a network error.
except OTSClientError as e:
print "get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
# サーバーが異常です。これは通常、誤ったパラメーターまたはネットワークエラーが原因です。
except OTSServiceError as e:
print "get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())
コードの詳細は、『BatchGetRow@GitHub』をご参照ください。
BatchWriteRow
1つ以上のテーブル内の複数のデータ行をまとめて挿入、変更、または削除します。
BatchWriteRow 操作は、基本的に複数の PutRow、UpdateRow および DeleteRow 操作のセットです。 各操作が実行され、結果が戻され、容量ユニットが個別に消費されます。
API
"""
説明: この操作バッチは、複数行のデータをバッチ変更します。
request = MiltiTableInBatchWriteRowItem()
request.add(TableInBatchWriteRowItem(table0, row_items))
request.add(TableInBatchWriteRowItem(table1, row_items))
response = client.batch_write_row(request)
response は tablestore.metadata.BatchWriteRowResponse 型の戻された結果を示します。
"""
def batch_write_row(self, request):
例
この例では、データはバッチ書き込みされます。
put_row_items = []
## PutRow で行を追加します。
for i in range(0, 10):
primary_key = [('gid',i), ('uid',i+1)]
attribute_columns = [('name','somebody'+str(i)), ('address','somewhere'+str(i)), ('age',i)]
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.IGNORE)
item = PutRowItem(row, condition)
put_row_items.append(item)
## UpdateRow で行を追加します。
for i in range(10, 20):
primary_key = [('gid',i), ('uid',i+1)]
attribute_columns = {'put': [('name','somebody'+str(i)), ('address','somewhere'+str(i)), ('age',i)]}
row = Row(primary_key, attribute_columns)
condition = Condition(RowExistenceExpectation.IGNORE, SingleColumnCondition("age", i, ComparatorType.EQUAL))
item = UpdateRowItem(row, condition)
put_row_items.append(item)
## DeleteRowで行を追加します。
delete_row_items = []
for i in range(10, 20):
primary_key = [('gid',i), ('uid',i+1)]
row = Row(primary_key)
condition = Condition(RowExistenceExpectation.IGNORE)
item = DeleteRowItem(row, condition)
delete_row_items.append(item)
# バッチ書き込み要求を作成します。
request = BatchWriteRowRequest()
request.add(TableInBatchWriteRowItem(table_name, put_row_items))
request.add(TableInBatchWriteRowItem('notExistTable', delete_row_items))
# バッチ書き込み操作を実行するには、batch_write_row メソッドを呼び出します。 要求パラメーターが正しくない場合は、例外がスローされます。 データが特定の行に書き込まれなかった場合、内部項目は失敗しますが、例外はスローされません。
try:
result = client.batch_write_row(request)
print ('Result status: %s'%(result.is_all_succeed()))
## PutRow の結果を確認します。
print ('check first table\'s put results:')
succ, fail = result.get_put()
for item in succ:
print ('Put succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print ('Put failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
## UpdateRow の結果を確認します。
print ('check first table\'s update results:')
succ, fail = result.get_update()
for item in succ:
print ('Update succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print ('Update failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
## DeleteRow の結果を確認します。
print ('check second table\'s delete results:')
succ, fail = result.get_delete()
for item in succ:
print ('Delete succeed, consume %s write cu.' % item.consumed.write)
for item in fail:
print ('Delete failed, error code: %s, error message: %s' % (item.error_code, item.error_message))
# クライアントが異常です。これは通常、誤ったパラメーターまたはネットワークエラーが原因です。
except OTSClientError as e:
print "get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
# サーバーが異常です。これは通常、誤ったパラメーターまたはネットワークエラーが原因です。
except OTSServiceError as e:
print "get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())
コードの詳細は、『BatchWriteRow@GitHub』をご参照ください。
GetRange
指定されたプライマリキー範囲内のデータを読み取ります。
API
"""
説明: この操作は、指定された範囲内の複数の行からデータを読み取ります。
table_name はテーブルの名前です。
direction は範囲の方向を示します。文字列フォーマット、値: 'FORWARD' または 'BACKWARD'。
inclusive_start_primary_key は 始まりのプライマリキーです (包括的) 。
exclusive_end_primary_key は終了のプライマリキーです(排他的)。
columns_to_get はリスト形式で読み込む列の名前を示すオプションのパラメーターです。 入力しないと、すべての列が読み取られます。
limit は読み込む行の最大数を示すオプションのパラメーターです。 入力しない場合、読み取る行数は制限されません。
column_filter はオプションのパラメーターで、指定された条件を満たす行を読み込むことを示します。
max_version はオプションのパラメーターで、返されるバージョンの最大数を示します。 max_version と time_range は相互に排他的です。
time_range はオプションのパラメーターで、返されるバージョンの範囲を示します。 time_range と max_version は相互に排他的です。
start_column はオプションのパラメーターで、ワイドロー読み込みの場合、現在の読み込み操作の開始列を示します。
end_column はオプションのパラメーターで、ワイドロー読み込みの場合、現在の読み込み操作の終了列を示します。
token はオプションのパラメーターで、ワイドロー読み込みの場合、現在のリードオペレーションの開始列の位置を示します。 コンテンツはバイナリ形式でエンコードされており、前のリクエストの結果から返されます。
戻り値: 条件を満たすデータの結果リスト。
consumed は、操作によって消費された CapacityUnits を示します。 これは tablestore.metadata.CapacityUnit クラスのインスタンスです。
next_start_primary_key は、次の get_range 操作を開始するプライマリキー列の値を示します。型: dict。
row_list は戻された行データのリストを [Row, ...] の形式で示します。
"""
def get_range(self, table_name, direction,
inclusive_start_primary_key,
exclusive_end_primary_key,
columns_to_get=None,
limit=None,
column_filter=None,
max_version=None,
time_range=None,
start_column=None,
end_column=None,
token = None):
例
指定された範囲のデータを読み込みます。
# クエリ範囲のプライマリキーの先頭
inclusive_start_primary_key = [('uid',INF_MIN), ('gid',INF_MIN)]
# クエリ範囲の最後のプライマリキー
exclusive_end_primary_key = [('uid',INF_MAX), ('gid',INF_MAX)]
# すべての列を問い合わせる
columns_to_get = []
# 一度に最大 90 件の結果が戻されます。 最初のクエリで合計 100 件の結果が戻され、上限が 90 件に設定されている場合、最初に最大 90 件、最小 0 件の結果が戻される可能性がありますが、 next_start_primary_key は None ではありません。
limit = 90
# フィルターを設定します。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("address", 'China', ComparatorType.EQUAL))
cond.add_sub_condition(SingleColumnCondition("age", 50, ComparatorType.LESS_THAN))
try:
# get_range インターフェイスを呼び出します。
consumed, next_start_primary_key, row_list, next_token = client.get_range(
table_name, Direction.FORWARD,
inclusive_start_primary_key, exclusive_end_primary_key,
columns_to_get,
limit,
column_filter = cond,
max_version = 1
)
all_rows = []
all_rows.extend(row_list)
# next_start_primary_key の値が null 値ではない場合、さらにデータが存在し、読み取りが続行されます。
while next_start_primary_key is not None:
inclusive_start_primary_key = next_start_primary_key
consumed, next_start_primary_key, row_list, next_token = client.get_range(
table_name, Direction.FORWARD,
inclusive_start_primary_key, exclusive_end_primary_key,
columns_to_get, limit,
column_filter = cond,
max_version = 1
)
all_rows.extend(row_list)
# プライマリキー列と属性列を表示します。
for row in all_rows:
print (row.primary_key, row.attribute_columns)
print ('Total rows: ', len(all_rows))
# クライアントが異常です。これは通常、誤ったパラメーターまたはネットワークエラーが原因です。
except OTSClientError as e:
print "get row failed, http_status:%d, error_message:%s" % (e.get_http_status(), e.get_error_message())
# サーバーが異常です。これは通常、誤ったパラメーターまたはネットワークエラーが原因です。
except OTSServiceError as e:
print "get row failed, http_status:%d, error_code:%s, error_message:%s, request_id:%s" % (e.get_http_status(), e.get_error_code(), e.get_error_message(), e.get_request_id())
コードの詳細は、『GetRangeRow@GitHub』を参照します。