表格存储支持在查询数据时使用过滤器在服务端按指定条件进行数据过滤,本文介绍如何在 Python SDK 中使用过滤器。
前提条件
过滤器类型
表格存储的过滤器类型包括以下 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)