Tablestore では、インデックステーブルから単一のデータ行、またはプライマリキー値が特定の範囲内にあるデータを読み取ることができます。 取得したい属性列がインデックステーブルに含まれている場合は、インデックステーブルを読み取ってデータを取得できます。 そうでない場合は、データテーブルからデータをクエリする必要があります。
前提条件
クライアントが初期化されていること。 詳細については、「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())