すべてのプロダクト
Search
ドキュメントセンター

Tablestore:セカンダリインデックスからのデータの読み取り

最終更新日:Sep 30, 2026

Tablestore では、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。 取得したい属性列がインデックステーブルに含まれている場合は、インデックステーブルを読み取ってデータを取得できます。 そうでない場合は、データテーブルからデータをクエリする必要があります。

前提条件

注意事項

  • インデックステーブルは、データの読み取りにのみ使用できます。

  • ローカルセカンダリインデックスの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。

  • 取得する属性列がインデックステーブルにない場合は、データテーブルからデータをクエリする必要があります。

単一行のデータの読み取り

GetRow API を呼び出して、単一のデータ行を読み取ることができます。 詳細については、「単一行のデータの読み取り」をご参照ください。

パラメーター

GetRow API を使用してインデックステーブルからデータを読み取る場合は、次の点にご注意ください:

  • table_name をインデックステーブルの名前に設定してください。

  • Tablestore は、データテーブルのプライマリキー列がインデックス列としてまだ定義されていない場合、それらをインデックステーブルのプライマリキーに自動的に追加します。 したがって、行のプライマリキーを設定する際には、インデックス列と、これらの自動的に追加されたプライマリキー列の両方を指定する必要があります。

例

次の例では、インデックステーブルから指定されたプライマリキーを持つデータ行を読み取る方法を説明します。

# プライマリキーを作成します。 最初のプライマリキー列は definedcol1 で、値は 1 です。 2番目のプライマリキー列は pk1 で、値は 101 です。 3番目のプライマリキー列は、データテーブルから追加されたプライマリキー pk2 で、値は 11 です。
# ローカルセカンダリインデックスからデータを読み取る場合、インデックステーブルの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。
primary_key = [('definedcol1', 1), ('pk1', 101), ('pk2', 11)]

# 返す属性列は definedcol2 と definedcol3 です。 columns_to_get が [] に設定されている場合、インデックステーブルのすべての属性列が返されます。
columns_to_get = ['definedcol2', 'definedcol3']

# フィルターを設定して列条件を追加します。 フィルター条件は、definedcol2 列の値が 1 と等しくなく、definedcol3 列の値が 'test' と等しいというものです。
cond = CompositeColumnCondition(LogicalOperator.AND)
cond.add_sub_condition(SingleColumnCondition("definedcol2", 1, ComparatorType.NOT_EQUAL))
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'test', ComparatorType.EQUAL))

try:
    # get_row API を呼び出してデータをクエリします。
    # インデックステーブル名を設定します。 最後のパラメーター 1 は、値の 1 つのバージョンのみが返されることを示します。
    consumed, return_row, next_token = client.get_row('<INDEX_NAME>', primary_key, columns_to_get, cond, 1)
    print('Read succeed, consume %s read cu.' % consumed.read)
    print('Value of primary key: %s' % return_row.primary_key)
    print('Value of attribute: %s' % return_row.attribute_columns)
    for att in return_row.attribute_columns:
        # 各列のキー、値、およびバージョンを出力します。
        print('name:%s\tvalue:%s' % (att[0], att[1]))
# クライアント例外が発生しました。通常、無効なパラメーターまたはネットワークエラーが原因です。
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()))

範囲データの読み取り

GetRange API を呼び出して、データの範囲を読み取ることができます。 詳細については、「範囲データの読み取り」をご参照ください。

パラメーター

GetRange API を使用してインデックステーブルからデータを読み取る場合は、次の点にご注意ください:

  • table_name をインデックステーブルの名前に設定してください。

  • Tablestore は、データテーブルのプライマリキー列がインデックス列としてまだ定義されていない場合、それらをインデックステーブルのプライマリキーに自動的に追加します。 したがって、開始プライマリキーと終了プライマリキーを設定する際には、インデックス列と、これらの自動的に追加されたプライマリキー列の両方を指定する必要があります。

例

次の例では、指定されたプライマリキーの範囲内のデータを読み取る方法を説明します。

# 範囲クエリの開始プライマリキーを設定します。 ローカルセカンダリインデックスからデータを読み取る場合、インデックステーブルの最初のプライマリキー列は、データテーブルの最初のプライマリキー列と同じである必要があります。
inclusive_start_primary_key = [('definedcol1', 1), ('pk1', INF_MIN), ('pk2', INF_MIN)]

# 範囲クエリの終了プライマリキーを設定します。
exclusive_end_primary_key = [('definedcol1', 5), ('pk1', INF_MAX), ('pk2', INF_MIN)]

# インデックステーブル内のすべての列をクエリします。
columns_to_get = []

# 一度に最大 90 行を返します。 合計で 100 件の結果があり、最初のクエリで limit を 90 に設定した場合、最初のクエリは最大 90 件、最小 0 件の結果を返しますが、next_start_primary_key は None ではありません。
limit = 90

# フィルターを設定して列条件を追加します。 フィルター条件は、definedcol2 列の値が 50 未満で、definedcol3 列の値が 'China' と等しいというものです。
cond = CompositeColumnCondition(LogicalOperator.AND)
# 行に指定された列が含まれていない場合は、pass_if_missing パラメーターを設定して、その行がフィルター条件を満たすかどうかを決定する必要があります。
# pass_if_missing を設定しないか、True に設定した場合、列を含まない行はフィルター条件を満たします。
# pass_if_missing を False に設定した場合、列を含まない行はフィルター条件を満たしません。
cond.add_sub_condition(SingleColumnCondition("definedcol3", 'China', ComparatorType.EQUAL, pass_if_missing=False))
cond.add_sub_condition(SingleColumnCondition("definedcol2", 50, ComparatorType.LESS_THAN, pass_if_missing=False))

try:
    # get_range API を呼び出します。
    # インデックステーブル名を設定します。
    consumed, next_start_primary_key, row_list, next_token = client.get_range(
        '<INDEX_NAME>', Direction.FORWARD,
        inclusive_start_primary_key, exclusive_end_primary_key,
        columns_to_get,
        limit,
        column_filter=cond,
        max_version=1,
        time_range=(1557125059000, 1557129059000)  # start_time は 1557125059000 以上、end_time は 1557129059000 未満です。
    )

    all_rows = []
    all_rows.extend(row_list)

    # next_start_primary_key が空でない場合は、データの読み取りを続行します。
    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(
            '<INDEX_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())

よくある質問

関連ドキュメント

  • 非プライマリキー列でのクエリ、複合列クエリ、あいまいクエリなどの多次元クエリ要件や、最大値の計算、行数のカウント、データのグループ化などのデータ分析要件がある場合は、必要な属性をフィールドとして多次元インデックスに追加できます。 その後、多次元インデックスを使用してデータをクエリおよび分析できます。 詳細については、「多次元インデックス」をご参照ください。

  • SQL を使用してデータをクエリおよび分析するには、SQL クエリ機能を使用できます。 詳細については、「SQL クエリ」をご参照ください。