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』を参照します。