Tablestore は、クエリ時に指定された条件に基づいてサーバー側データフィルタリングをサポートしています。Python SDK のフィルターを使用すると、フィルター条件に一致する行のみを返すことができます。
前提条件
フィルターの種類
Tablestore は、以下の 2 種類のフィルターを提供しています。
-
SingleColumnCondition: 単一の属性列が指定された条件を満たすかどうかに基づいて行をフィルターします。
-
CompositeColumnCondition: 複数のフィルター条件を組み合わせて、複雑なフィルタリングを実行します。
単一列条件
class SingleColumnCondition(ColumnCondition)
コード例
次の例では、[row1, row3) の範囲にプライマリキーを持つ行に対して範囲クエリを実行し、フィルターを適用します。col1 属性列の値が val1 である行のみが返されます。
try:
# クエリの開始プライマリキーを設定します。
inclusive_start_primary_key = [('id', 'row1')]
# クエリの終了プライマリキーを設定します。終了キーは排他的です。
exclusive_end_primary_key = [('id', 'row3')]
# 条件 col1 == "val1" でフィルターを作成します。
singleColumnCondition = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# get_range メソッドを呼び出してデータをクエリします。
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=singleColumnCondition)
# 結果を処理します。
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("範囲取得がエラーで失敗しました: %s" % e)
-
指定された属性列を含まない行が返されるのを防ぐには:
singleColumnCondition.pass_if_missing = False -
クエリ結果内のすべてのデータバージョンを評価し、いずれかのバージョンが条件を満たす場合に行を返すには:
singleColumnCondition.latest_version_only = False
複合列条件
複合フィルターは、最大 32 の条件をサポートします。
class CompositeColumnCondition(ColumnCondition)
コード例
次の例では、[row1, row3) の範囲にプライマリキーを持つ行に対して範囲クエリを実行し、結果に複合フィルターを適用します。
try:
# クエリの開始プライマリキーを設定します。
inclusive_start_primary_key = [('id', 'row1')]
# クエリの終了プライマリキーを設定します。終了キーは排他的です。
exclusive_end_primary_key = [('id', 'row3')]
# 最初の単一列条件 col1 == "val1" を作成します。
singleColumnCondition1 = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# 2番目の単一列条件 col2 == "val2" を作成します。
singleColumnCondition2 = SingleColumnCondition('col2', 'val2', ComparatorType.EQUAL)
# 最初の複合条件 col1 == "val1" OR col2 == "val2" を作成します。
compositeColumnCondition1 = CompositeColumnCondition(LogicalOperator.OR)
compositeColumnCondition1.add_sub_condition(singleColumnCondition1)
compositeColumnCondition1.add_sub_condition(singleColumnCondition2)
# 3番目の単一列条件 col3 == "val3" を作成します。
singleColumnCondition3 = SingleColumnCondition('col3', 'val3', ComparatorType.EQUAL)
# 最終的な複合条件 (col1 == "val1" OR col2 == "val2") AND col3 == "val3" を作成します。
compositeColumnCondition2 = CompositeColumnCondition(LogicalOperator.AND)
compositeColumnCondition2.add_sub_condition(compositeColumnCondition1)
compositeColumnCondition2.add_sub_condition(singleColumnCondition3)
# get_range メソッドを呼び出してデータをクエリします。
consumed, next_start_primary_key, row_list, next_token = client.get_range('test_table', Direction.FORWARD,
inclusive_start_primary_key,
exclusive_end_primary_key,
column_filter=compositeColumnCondition2)
# 結果を処理します。
print('* Read CU Cost: %s' % consumed.read)
print('* Write CU Cost: %s' % consumed.write)
print('* Rows Data:')
for row in row_list:
print(row.primary_key, row.attribute_columns)
except Exception as e:
print("範囲取得がエラーで失敗しました: %s" % e)