Table Store支援在查詢資料時使用過濾器在服務端按指定條件進行資料過濾,本文介紹如何在 Python SDK 中使用過濾器。
前提條件
過濾器類型
Table Store的過濾器類型包括以下 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("Range get failed with error: %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')]
# 構造單屬性列值過濾器1,條件為 col1 == "val1"
singleColumnCondition1 = SingleColumnCondition('col1', 'val1', ComparatorType.EQUAL)
# 構造單屬性列值過濾器2,條件為 col2 == "val2"
singleColumnCondition2 = SingleColumnCondition('col2', 'val2', ComparatorType.EQUAL)
# 構造組合過濾器1,條件為 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)
# 構造組合過濾器2,條件為 組合過濾器1 and 單屬性列值過濾器3,即 (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("Range get failed with error: %s" % e)